Maybeモナド
失敗するかもしれない計算を表現する
通常は
実行時エラーの場合そこで落ちてしまうが、Maybeモナドを使うことで先に進めることができる
「1個までしか値が持てないリスト」と考えることができる
個数が制限されていること以外はリストもなどと基本的に同じ
0個がNothing, 1個がJust x
型
hsdata Maybe a = Just a | Nothing
実装
hsinstance Monad Maybe where
return x = Just x
Nothing >>= f = Nothing
Just x >>= f = f x
fail _ = Nothing
fail
はパターンマッチが失敗したときなどに暗黙的に使われる
パターンマッチが失敗する例
hsf :: Maybe [Int]
f = do
x : xs <- Just [] -- x:xsでパターンマッチするが与えられるのは[]なので失敗する
return x
こういう失敗があったときに暗黙的に Nothing
を返すことで、do式全体の結果はエラーではなく Nothing
になる
>>
を用いた例
hsNothing >> 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: リストから除外する
hslt :: Int -> Maybe Int
lt x | x > 0 = Just x
| otherwise = Nothing
main = print $ mapMaybe lt [-2, -1, 0, 1, 2] -- [1, 2]
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から値を取り出す
hscase value of
Nothing -> Nothing
Just a -> a
参考