7. 安全な solveRPN
•bind するときに pattern match
•pattern match に失敗すると Nothing
solveRPN :: String -> Maybe Double
solveRPN st = do
[result] <- foldM foldingFunction [] (words st)
return result
http://ideone.com/BiVXC4
Sunday, September 8, 13
8. モナディック関数の合成
<=<
-- ただの関数合成 .
f = (+1) . (*100)
-- モナディック関数の合成 <=<
-- テキストでは型宣言が無いが、型宣言が無いとコンパイルエラーになる。
g :: (Monad m, Num a) => a -> m a
g = (x -> return (x + 1)) <=< (x -> return (x * 100))
Sunday, September 8, 13
9. . → >=>
id → return
-- これはただの関数合成
f' = foldr (.) id [(+8),(*100),(+1)]
•ナイトが3手で行けるかを確認する関数
canReachIn3 を
関数合成でn手に一般化します。
•コード参照 http://ideone.com/l1GXEu
Sunday, September 8, 13
14. Prob は Monad?
>=>
• m >>= f は常に join (fmap f m) と等価
• join :: Prob (Prob a) -> Prob a
から考えて、それを使って >>= を定義
Sunday, September 8, 13
15. flatten (join)
•外側の確率と内側の確率を掛ける
flatten :: Prob (Prob a) -> Prob a
flatten (Prob xs) = Prob $ concat $ map multAll xs
where multAll (Prob innerxs, p) =
map ((x, r) -> (x, p*r)) innerxs
Sunday, September 8, 13
16. Prod as Monad
•モナド則を満たしていることを確認
instance Monad Prob where
-- 文脈に入れるときは、必ずそれが起こる (=生起確率 1) で入れる。
return x = Prob [(x, 1%1)]
-- m >>= f は join (fmap f m)
m >>= f = flatten (fmap f m)
-- パターンマッチに失敗したら
fail _ = Prob []
Sunday, September 8, 13