fugafuga.write

日々のログ

すごいH本 part12

case 式

コード中のどこででもパターンマッチが使えるようになる。case は式である。

head' :: [a] -> a
head' xs = case xs of [] -> error "error."
                      (x:_) -> x

関数のパターンマッチは case のシンタックスシュガーとなっている。

head' :: [a] -> a
head' [] = error "error."
head' (x:_) = x

case は式のどこででも使える。

describeList :: [a] -> String
describeList ls = "The list is "
                  ++ case ls of [] -> "empty."
                                [x] -> "a singleton list."
                                xs -> "a longer list."

実行結果

*Main> describeList []
"The list is empty."
*Main> describeList [1]
"The list is a singleton list."
*Main> describeList [1,2,3]
"The list is a longer list."

case の書き換え

case 式 と 関数定義のパターンマッチは同じであることから、

describeList' :: [a] -> String
describeList' ls = "The list is " ++ what ls
  where what [] = "empty."
        what [x] = "a singleton list."
        what xs = "a longer list."

実行

*Main> describeList' []
"The list is empty."
*Main> describeList' [1]
"The list is a singleton list."
*Main> describeList' [1,2,3]
"The list is a longer list."

所感

条件が複雑になってくるとどうなるのだろうか。個人的には where で書けるならそうしたほうが見やすいと感じた。

今日はここまで。

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

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

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