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


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

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

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

Real World Haskell 第3章の読書メモ

  • error関数は任意の型を返すエラー関数だ!
  • 失敗する可能性がある場合はMaybe型を使うのが定石だ!
  • Maybe型とパターンマッチの組み合わせはよく使うからマスターしようね!
  • 関数内の局所変数はletで定義できるぞ!
  • letは式に束縛されるのであって値に束縛されるわけじゃないぞ!遅延評価を忘れるな!
  • 変数スコープが違えば、入れ子の中で上のレベルの変数と同じ名前の変数を定義できるぞ!上のレベルの変数は隠れてしまうぞ!あんまり賢いやり方じゃないからな!
  • where を使えば変数定義を後回しにする事が出来るよ!これを使えば読みやすくなるんだ!変数定義だけじゃなくて関数定義も後回しに出来るぞ!
  • Haskellオフサイドルールを持つぞ!インデントの深さは大事だ!読みやすいインデントを心がけよう!
  • tabは使うの止めような!スペースのみにしよう!
  • セミコロンを使えばオフサイドルールを回避できるぞ!読みやすいか否かは場合によりけりだ!
  • case式を使えばパターンマッチを別の方法で記述できるぞ!F#と同じような感じだ!
  • パターンマッチで一致する条件にあれこれしたい時はガード条件を追加しよう!
  • ガード式otherwiseはTrueに束縛されているだけの変数だ

ここが気になる

  • mySecond :: [a] -> a とかいう表記が急に出て来た気がする。たぶん関数のシグネチャ定義だと思う。

練習問題

  • リスト中の要素数を数える関数を書きなさい。
myLength :: [a] -> Int
myLength xs = case xs of
                (_:xs) -> 1 + myLength xs
                []     -> 0

myLength2 :: [a] -> Int
myLength2 xs
         | null xs = 0
         | otherwise = 1 + myLength2 (tail xs)
  • リストの平均値を計算する関数を書きなさい
average xs = (sum xs) / fromIntegral(length xs)

これって、文字列のリストとかも渡せるんやけど、四則演算が出来る要素に限定するにはどうすればいいんやろ?

  • リストを回文にしなさい
makePalindrome xs = xs ++ reverse xs

"aba"みたいなもとから回文の入力も"abaaba"にしちゃうけど。。。

  • 入力したリストが回文か判定する関数を書きなさい
isPalindrome xs = xs == (reverse xs)
  • リストのリストをサブリストの長さでソートする関数を書きなさい
mysort :: [[a]] -> [[a]]
mysrot [] = []
mysort xs = sortBy (len) xs
       where len x y | length (x) < length (y) = LT
                     | otherwise = GT
  • 区切りとなる値を使ってリストのリストを連結する関数を作りなさい
interspace :: a -> [[a]] -> [a]
interspace _ [] = []
interspace _ (x:[]) = x
interspace c (x:xs) = x ++ [c] ++ interspace c (xs)

なんか二つ目のパターンマッチがカッコいいとは思えないけど。。。



練習問題の途中ですが力尽きました。

まとめ


パターンマッチは便利。