学習の素材は、
関数プログラミング実践入門
この表記は、私見・感想です。
型コンストラクタ
モナドを学習している最中だが、どうもこのキーワードの意味をしっかりと理解していないと、コードを読み辛いことに気づいた。
言葉の理解
型コンストラクタとは、 それ自体が型であるが、別の型をくっつけて新たな型を作るものである。
型 []
は、型一つを包んでリストになる リストの型コンストラクタ であり、型 (,)
は型二つを包んでタプルになる タプルの型コンストラクタ である。
同じように、 型 Either
は型二つを包んで Either a b
を作る Either
の型コンストラクタ である。
一方、値としての []
は空リスト、値としての (,)
はタプルのコンストラクタであることに注意する。
OOPのコーディング形式が頭から離れず、例えば
State state a
と書いてあっても 型State state a
である とすぐに脳内変換できない。なんとなくstate
やa
にはState
の実体が参照されるような気がしてしまい、ノイズになる。
型クラス モナドのインスタンスになる条件
型クラス モナドのインスタンスは、(あと一つ、型をくっつければ有効な型となる)型コンストラクタである。
-- モナド型クラスの定義
class Monad (m :: * -> *) where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
fail :: String -> m a
-- [](リスト[a]の型コンストラクタ)
instance Monad [] -- あと一つ、型をくっつければ有効な型となる
-- State state (型State state a の型コンストラクタ)
instance Monad (State state) -- あと一つ、型をくっつければ有効な型となる
多分、
* -> *
という表記の意味するところが、型引数を一つ持つ型コンストラクタ ということなのだろう。また、結果的に当たり前なのだが、モナドのアクションは、この型コンストラクタ + 一つの型 が返り値の型となりそうだ。