すごいHaskell七章後半(7.7〜終わりまで)
Listを作ってみる+値コンストラクタについて
data List a = Empty | Cons a (List a) deriving (Show, Read, Eq, Ord)
Consは:を言い換えたものって書かれてるので実際に型を見てみる。
ghci> :t (:) (:) :: a -> [a] -> [a] ghci> :t Cons Cons :: a -> List a -> List a
おおー!同じだ。
:って値コンストラクタだったのか……
関数の印象があったから不思議な感じ。というか値コンストラクタも関数の一種…?
ってそう書いてた。
値コンストラクタもデータ型を返す関数 (137p)
マジすか。
ゼロ引数な値コンストラクタは、値コンストラクタ名と同じデータ型を返してるってことかな。
中置記法の値コンストラクタ…頭が混乱する。
パターンマッチについてさらっと言ってるコレ。
パターンマッチとは値コンストラクタをマッチさせることにほかならない(略) : は Haskell 組み込みのリストの値コンストラクタなので (略) 当然パターンマッチできます。 (略) パターンマッチは値コンストラクタであれば何に対してでも使えるので、通常の前置コンストラクタに加えて8や'a'といったものもパターンマッチできます。これらは数値型や文字型の値コンストラクタだからです。(139p)
たしかに、数値型や文字型って、(実際はどうやってるかわからないけど)ひたすらゼロ引数の値コンストラクタを並べたら定義できるんだよな。だから、直接値をパターンマッチできる。(ように見える)[]が値コンストラクタっていうのも、理屈では分かってきたけどなかなかしっくりこない。
あと、パターンマッチは値コンストラクタをマッチさせるから、フィールドについては、変数で引き受けるのか。かな?
値コンストラクタの話、まだはっきりイメージが掴めてないけど、複雑な理論で、シンプルに使えるシステムを構築してる感じ。
ファンクターになっています
この文の「ファンクターになっています」の意味がわからなかった。
Maybe はこんなふうにしてファンクターになっています。
instance Functor Maybe where fmap f (Just x) = Just (f x) fmap f Nothing = Nothing(153p)
分かった。Functor って型クラスなんだから、「ファンクターになっています」は、 「Functor のインスタンスになっています」という意味なんだな。ここではインスタンスになるために必要な関数を定義していると。 map の先入観がすごくて、 Functor を関数か何かかと思ってた。
普通の型クラスと違う所は、型変数に具体型じゃなくて型コンストラクタをとる所。それは、関数定義を見ると分かる。
class Functor f where fmap :: (a -> b) -> f a -> f b(151p)
fmap の引数と返り値の型が f a の形だから、 f は型コンストラクタじゃないといけないことが分かる。で合ってるよね?
fmap は Functor に属する型の、「箱の中の値」に関数を適用するための関数か。
関数っぽい関数の型
式の型が下のようになっているとき、
(a -> b) (a -> a)
上の式は「ある型aから別の型bへの関数」を意味し、下の式は「ある型aから同じ型aへの関数」を意味する。カッコで囲まれてたら、それは関数なんだな。(関数っぽい関数)
値コンストラクタも関数だっけ…まあそれは置いておこう。