すごいHaskell本

今日は45ページから。「パターンマッチとwhere」

p45

initials :: String -> String -> String
initials firstname lastname = [f] ++ ". " ++ [l] ++ "."
    where (f:_) = firstname
          (l:_) = lastname

関数のパターンは網羅的なんだけど、whereでのパターンマッチでは空でないリストが
期待されているので、空文字列を渡すとExceptionが発生する。

*Main> initials "" ""
"*** Exception: chap3.hs:82:11-27: Irrefutable pattern failed for pattern (f : _)

引数でパターンマッチすると、ちゃんとコンパイル時に警告を出してくれる。(-Wall使用)

initials :: String -> String -> String
initials (f:_) (l:_) = [f] ++ ". " ++ [l] ++ "."
chap3.hs:81:1:
    Warning: Pattern match(es) are non-exhaustive
             In an equation for `initials':
                 Patterns not matched:
                     [] _
                     (_ : _) []

昨日の、constraintsが云々の警告の話。
第2回 スタートHaskell 感想 - 酔いどれコードを参考にし
て、-fno-warn-type-defaults オプションをつけたらとりあえず消えた。

あと、~/.ghci に

:set -O
:set -Wall
:set -fno-warn-type-defaults

というように書くと毎回オプションを付けてくれるそうな。Windows7でも、ホームディレク
トリに同じものを置いたら、ちゃんと読み込んでくれました。

……ここまでで1時間経過。色々調べてると1時間で1ページも進まないですねー。ま
あ、じっくりいきましょう。

メモ

  • whereのスコープはひとつのパターン内
  • whereはキーワード
  • letは式→値を持つ
  • letはローカルスコープに関数を作るのに使える
  • letはセミコロン区切りを使える

うーん、let式とcase式のところも終わったけれど、今ひとつピンとこない。とりあえ
ず今は進もう。後になって戻ってくれば分かるようになっているかもしれないから。
次は第4章、再帰について見ていきますよ。