Haskell その6

ゆっくり学んでおります。

ガード

f_positive1 n | n > 0 = True
              | otherwise = False

f_positive2_NG n | otherwise = False
                 | n > 0 = True

f_positive3_NG n | n > 0 = True
f_positive3_NG _ = False

上から下へ評価されるのでf_positive2_NGは全てFalseになる。
まさにガードしている感じ。

quicksort  []           =  []
quicksort (x:xs)        =  quicksort [y | y <- xs, y<x ]
                        ++ [x]
                        ++ quicksort [y | y <- xs, y>=x]

リスト内包表現中のブール式もガードと呼ばれる。
ならば、

[y | y < x <- xs ]

って書くほうが良くない?
…すいません、今は修行の身。
守離破の原則は守りましょうw

ユーザ定義型

data Mono = White | Black | Gray Int

gray White      = 0
gray Black      = 100
gray (Gray n)   = n

isWhite m = (gray m) == 0
isBlack m = (gray m) == 100

isGray White = False
isGray Black = False
isGray _     = True

やっと出ました、ユーザ定義型。
型Monoは無引数の型構築子、White、Blackは無引数のデータ構築子、Grayは引数ありのデータ構築子、と読む。
Gray以外を見ると、単なる列挙型。

命令型言語に慣れ親しんだ者としては、ユーザ定義型っていうと、構造体とかクラスとかを思い出すけど、
Haskellの説明の多くが列挙型から始まるのはなぜだろう。
↓を見ると、Haskellではタプル型が類似していると言うが…。

http://www.sampou.org/haskell/tutorial-j/goodies.html

つぎにあげるのは、ひとつのデータ構築子のみからなる型の例です。

data Point a = Pt a a

単一の構築子から構成されているので、Pointのような型はしばしばタプル型(tuple type)と呼ばれます。
これは、本質的にはべつの型の直積(この場合は2引数)だからです。
(タプル型は別の言語ではレコード型と呼ばれているものに類似しています。)
一方、BoolやColorのような複数の構築子をもつ型は直和型((disjoint) union or sum type)と呼ばれます。

…。守離破、守離破。ナムナム…。
でも、やっぱこういうの↓見ると安心するの僕だけか?

data Person = Person {name, address::String, age::Int}

まぁ、いい、先を急ごう。

class

これはこちら↓のほうが理解しやすい。
http://www.geocities.jp/shido_takafumi/hs/haskell7.html

instance Eq Mono where
    m == m' = (gray m) == (gray m')

instance Show Mono where
    show White      = "White"
    show Black      = "Black"
    show (Gray 0)   = "White"
    show (Gray 100) = "Black"
    show (Gray n)   = "Gray " ++ show n

EqやShowはCLOS(CommonLisp Object System)で有名(?)な総称関数。
Haskellで言うinstanceは、総称関数モデルで言うところのメソッド?

ググると、

  • 総称関数はC++のテンプレート
  • 総称関数はJavaのインターフェース

みたいな説明も見かけたけど…うーん。
未知の概念を説明するのって難しい…。

一番分かり易かったのはやはりこの方の説明。
http://jp.rubyist.net/magazine/?0013-Legwork
さすがです。先輩。