Haskellお勉強会第4日目まとめ


"Real World Haskell"の第3章の7節まで読み終えました。

Real World Haskell―実戦で学ぶ関数型言語プログラミング

Real World Haskell―実戦で学ぶ関数型言語プログラミング

Real World Haskell 第3章の読書メモ

  • パターンマッチは同じ名前の関数を複数定義することによって定義するんだ
  • パターンの順序は重要だ!上から順に当てはまるところで適応するぞ
  • どれにも当てはまらないパターンマッチは実行時エラーを出すぞ!
  • レコード構文を使えばアクセサを簡単に定義できるぜ!
  • レコード構文を使えば値生成時にフィールドを指定する事で各要素の書く順番を変えられるよ!
  • MaybeはF#でいうOption型だ! Maybe a = Just a | Nothing と名前は全然違うけどな!
  • 型の定義は再帰的にできるぞ!

ここが気になる

  • 当てはまらないパターンで実行時にエラーとか、危なくないですかね? -> GHCコンパイラオプション(-fwarn-incomplete-pattern)で警告してくれるらしい
  • レコード構文のこういう書き方にちょっと違和感
data Customer = Customer {
       customerID        :: CustomerID
     , customerName      :: String
     , customerAddress   :: Address
     } deriving(Show)
  • こういう書き方はHaskellでは一般的じゃないのかな?
data Customer = Customer {
       customerID        :: CustomerID,
       customerName      :: String,
       customerAddress   :: Address
     } deriving(Show)
  • ":t Just"では "a -> Maybe a"って出るのに、":t Just 1"では"Fractional a => Maybe a"とか出た
  • => ってなんぞ?

練習問題

  • List a を取り、[a]を生成するfromListとは逆の関数を書きなさい
toList (Cons x xs) = x : (toList xs)
toList Nil = []
  • Javaの例でやったように1つしか構成子がないような木の型を定義しなさい。ノードの子の型にMaybeを使いなさい

これが意外と苦戦しました。最初はこんなコードを書きました。

data Tree a = Node a (Maybe (Tree a)) (Maybe (Tree a))
              deriving(Show)

これだと空の木が作れません。


ノードの値もMaybeにすると

data Tree a = Node (Maybe a) (Maybe (Tree a)) (Maybe (Tree a))
              deriving(Show)

みたいになってしまって、

Node Nothing (Just (Node (Just 1) Nothing Nothing)) (Just (Node (Just 1) Nothing Nothing))

ノードの値がNothingなのに部分木があるという非常にキモい木を許してしまいます。

ですが、もとのJavaのコードもNodeがnullで子の部分木があるという状況はありえるので、とりあえずこれで良しとしました。


この問題は反面教師的な練習問題なので、ムキになってもしょうがないのです。