Eitherモナド
成功時だけでなく、失敗時にも値が返せるモナド
Maybeモナドとの比較
table:Habit Tracker
型 失敗 成功
Maybe a Nothing Just a
Either a b Left a Right b
「Right」は「正しい」という意味と掛けている
型
code:hs
data Either a b = Left a | Right b
実装
code:hs
instance Monad (Either e) where
return x = Right x
Right m >>= k = k m
Left e >>= _ = Left e
Maybeモナドとほぼ同じだねmrsekut.icon
ミソは何故型引数を2つ取るEither型でMonad型クラスのインスタンスにできるか、である
関数
either:: (a -> c) -> (b -> c) ->Either a b -> c LeftとRightの値を処理する関数を渡してEitherを取り除く
code:hs
import Data.Either
test = either (+ 1) (* 2)
main = do
print $ test $ (Left 4) -- 5
print $ test $ (Right 4) -- 8
参考
この記事とその続きの記事、ユースケースを定めてEitherモナドを再実装するような流れなので、Eitherモナドを全く知らない人からしたら、Either型と、モナドの嬉しさがよくわかるのでは