ピエールリターンズ
ピエールの綱渡りの一連の処理を do を使って書く
routine :: Maybe Pole routine = do start <- return (0, 0) first <- landLeft 2 start second <- landRight 2 first landLeft 1 second
実行
*Main> routine Just (3,2)
手続き型のように見えるがそうではない。
ピエールにバナナの皮を踏ませたい場合
routine :: Maybe Pole routine = do start <- return (0, 0) first <- landLeft 2 start Nothing second <- landRight 2 first landLeft 1 second
実行
*Main> routine Nothing
ピエールはしっかり落ちた。
<-
の束縛をせずにモナドを使うと、
結果を無視したいモナドの後に>>
を使うのと同じ意味になる。
_ <- Nothing
と書くと同じ処理になるが、Nothing
だけのほうがシンプルである。
do 記法を使うか >>=
を使うかは自分次第で、ピエールの例だと>>=
がよい。
なぜなら、直前のモナドに次のモナドが依存しているから。
do 式におけるパターンマッチ
do 記法でモナド値を変数名に束縛するときにパターンマッチが使える。
justH :: Maybe Char justH = do (x:xs) <- Just "hello" return x
実行
*Main> justH Just 'h'
do 式の中でパターンマッチが失敗した場合、Monad型クラスのfail関数が使われる。
fail :: (Monad m) => String -> m a fail msg = error msg
デフォルトではプログラムを異常終了させるようになっている。 一方、Maybe の fail の実装は以下のようになっている。
fail _ = Nothing
msg を無視して Nothing を返している。
パターンマッチに失敗するような do 式を書く
wopwop :: Maybe Char wopwop = do (x:xs) <- Just "" return x
実行
*Main> wopwop Nothing
モナドの文脈で失敗が発生している。
所感
モナドが抽象化してくれているのでかんたんに書ける。

- 作者: MiranLipovaca
- 出版社/メーカー: オーム社
- 発売日: 2017/07/14
- メディア: Kindle版
- 購入: 4人 クリック: 9回
- この商品を含むブログを見る