Maybeモナド
失敗するかもしれない計算を表現する
通常は実行時エラーの場合そこで落ちてしまうが、Maybeモナドを使うことで先に進めることができる 「1個までしか値が持てないリスト」と考えることができる
個数が制限されていること以外はリストもなどと基本的に同じ
0個がNothing, 1個がJust x
型
code:hs
data Maybe a = Just a | Nothing
実装
code:hs
instance Monad Maybe where
return x = Just x
Nothing >>= f = Nothing
Just x >>= f = f x
fail _ = Nothing
failはパターンマッチが失敗したときなどに暗黙的に使われる
パターンマッチが失敗する例
code:hs
f = do
x : xs <- Just [] -- x:xsでパターンマッチするが与えられるのは[]なので失敗する
return x
こういう失敗があったときに暗黙的にNothingを返すことで、do式全体の結果はエラーではなくNothingになる
>>を用いた例
code:hs
Nothing >> Just 3 -- Nothing
Just 3 >> Just 4 -- Just 4
Just 3 >> Nothing -- Nothing
どちらかにNothingがあればNothingになる
mapMaybe:: (a -> Maybe b) -> [a] -> [b]
Maybeを外してリストを返すmap
Just: 取り出した値をリストに追加する
Nothing: リストから除外する
code:hs
lt :: Int -> Maybe Int
lt x | x > 0 = Just x
| otherwise = Nothing
isJust :: Maybe a -> Bool
isNothing :: Maybe a -> Bool
maybe :: b -> (a -> b) -> Maybe a -> b
第一引数が Nothing の時の default 値
第二引数が Just の中身に作用させる関数
catMaybes :: [Maybe a] -> [a]
fromJust :: Maybe a -> a
Justを剥く。ちょっと無理やりな方法
fromMaybe :: a -> Maybe a -> a
listToMaybe :: [a] -> Maybe a
maybeToList :: Maybe a -> [a]
Maybeから値を取り出す
code:hs
case value of
Nothing -> Nothing
Just a -> a
参考