generated at
Maybeモナド
失敗するかもしれない計算を表現する
通常は実行時エラーの場合そこで落ちてしまうが、Maybeモナドを使うことで先に進めることができる
「1個までしか値が持てないリスト」と考えることができる
個数が制限されていること以外はリストもなどと基本的に同じ
0個がNothing, 1個がJust x


hs
data Maybe a = Just a | Nothing

実装
hs
instance Monad Maybe where return x = Just x Nothing >>= f = Nothing Just x >>= f = f x fail _ = Nothing
fail はパターンマッチが失敗したときなどに暗黙的に使われる
パターンマッチが失敗する例
hs
f :: Maybe [Int] f = do x : xs <- Just [] -- x:xsでパターンマッチするが与えられるのは[]なので失敗する return x
こういう失敗があったときに暗黙的に Nothing を返すことで、do式全体の結果はエラーではなく Nothing になる


>> を用いた例
hs
Nothing >> Just 3 -- Nothing Just 3 >> Just 4 -- Just 4 Just 3 >> Nothing -- Nothing
どちらかにNothingがあればNothingになる





Data.Maybeの関数
mapMaybe :: (a -> Maybe b) -> [a] -> [b]
Maybeを外してリストを返すmap
Just: 取り出した値をリストに追加する
Nothing: リストから除外する
hs
lt :: 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から値を取り出す
パターンマッチを使う ref
hs
case value of Nothing -> Nothing Just a -> a


参考
Readerモナドとの関係