fugafuga.write

日々のログ

すごいH本 part86

ピエールリターンズ

ピエールの綱渡りの一連の処理を 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

モナドの文脈で失敗が発生している。

所感

モナドが抽象化してくれているのでかんたんに書ける。

すごいHaskellたのしく学ぼう!

すごいHaskellたのしく学ぼう!

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