haskellのMaybeとEither理解した。気がする。

[2015-01-15追記]
初心者の際に書いたとても古い記事ですので不正確な箇所が含まれます...
head, tailといった部分関数は実行時エラーを発生させてしまうため、使わないほうがいいでしょう。代わりにsafeパッケージ内の関数を使ってください。
https://hackage.haskell.org/package/safe
[追記ここまで]


そのため説明を試みる。

MaybeはJavaに於ける"null"を使用するために作られた型。

head関数を考える。リストの先頭の値を返す関数。型は[a] -> a。
ghciのプロンプトをここでは"ghci>"と書くことにする。

ghci> :type head
head :: [a] -> a
ghci> head [1,2,3]
1
ghci> head "abcd"
'a'
ghci> head []
*** Exception: Prelude.head: empty list

ここでheadは空リスト[]を引数としてとると、エラーを吐く。
何故か。他の言語では"null", "nil"あたりを返してくれそうなものだが、Haskellには"null"相当の「特別な値」は存在しない(nullは空リストを判定する「関数」として存在するが)。


Haskellは「強い静的型付き言語」であり、引数に応じて「異なる型」を返すことが出来ない。
前述のhead関数は空リストを引数としようとも、型aを返さなければならないのだ。
つまり、引数がIntのリストだった場合はIntを、

ghci> head [1,2,3]
1

引数がCharのリスト(String)だった場合はCharを

ghci> head ['a','b','c']
'a'

返さなければならない。
じゃあ空リストだったら何を返せばいい?
何も返せない。エラー。
-- undefinedは任意の型であるらしいけど、評価されるとエラーを吐く。

Maybe

だったら"null"相当の値(ここではNothing)を含む型を作ればいいじゃない。というマリー的発想により、次のMaybe a型を定義する。

data Maybe a = Just a | Nothing

このMaybe aを返り値の型とすれば万事解決する。Just aは実質的に型はaなのだけど、それをJustでラップすることでMaybe a型を構成している。Nothingの型はそのままMaybe aである。つまりどちらを返そうともMaybe a型に統一が出来るということだ。

head' :: [a] -> Maybe a
head' (x:xs) = Just x   -- これはMaybe a型
head' []     = Nothing  -- こちらもMaybe a型

これで空リストをとっても正常に動くhead'を定義できると。

Either

Eitherも同じ。異なる型aとbを引数に応じてケースバイケースで返したい場合、そのままではもちろん駄目だ。返り値は一定の型を持たなければ。じゃあ両方をラップして統合した型を作ればいいじゃない。

data Either a b = Left a | Right b

これでa,bの型が異なっていようとも、Left aとRight bの型は共にEither a b型である。
もちろんwrappingが目的なら"EITHER"という単語を選ぶ意味がないのだけど。その辺は多分モナドで。

なんで"null"はないのか

以上のようにMaybeとEitherを理解した。
"null"相当の値があればあればいいんじゃねーの。とも思うけどまあHaskellだし。
"null"つくってもEitherのようなことは出来ないし。いや、元々出来るし。
というわけで、冗長だから省いたのではあるまいか。
Haskell本読んでるとHaskellは「より少ない法則でより多くのことを記述出来るようにする」ことに力を入れている気がする。
論理和演算子の(||)なんか他の言語(C,Java,..)では内部で特別な処理を行うことが多いらしいのだけど、Haskellでは遅延評価があるからただの関数扱いだとか。map関数なんて定義2行。
それでいて読みやすくする工夫がされている。
二値演算子ならなんでも中置演算子に出来ることとか。括弧すくなくするための$とか。
オフサイドルールによる可読性向上だとか。
透明参照性を保っているために、副作用がある関数とない関数を明確に分離出来ることだとか。
for文やwhile文は存在しないけど、再帰関数て要は漸化式を書けばいいわけで。考えてみればそんなに難しいことじゃない。たぶん。
まあそれらが皆に受け入れられるかどうかは別問題なのだけど。俺はそういうポリシーは好きだ。