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


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

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

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

Real World Haskell 第2章の読書メモ

  • Haskellは強い静的型付けをするかんな!強いとか弱いとかは良い悪いとは関係ないからな!喧嘩すんな!
  • Int型とInteger型は違うからな。Int型の大きさはCPUのビット数だ
  • 関数適用はどの演算子よりも優先順位が高いからな
  • リストは中身が何でも持てる!「多相的」なんだ
  • 型名は大文字で変数名と型変数名は小文字から始まらないといけないんだ。これは規則なんだ
  • タプルは型が違っても保持できるぜ。でも要素が多いタプルはあんまり作んな。馬鹿っぽいからな。
  • 関数が何をするかは型情報からある程度予測がつくぜ
  • 関数名と型情報と、副作用が無いことが関数の動きを分かりやすくしているぜ
  • 型にIO とか付いてるのは副作用を持っているぜ
  • 変数は値が「束縛」されたものだ。代入ではなく、変数と式との結びつきだから互いに置き換え可能だ!
  • if は文ではなく式だから、thenとelseで型が合ってる必要があるぜ
  • リストが空か否かはnull関数を使ってくれ!Haskellにもnullはあるんだ!
  • 関数を適用する前に引数を評価するのを「正格評価」というんだ!
  • Haskellは引数の評価を必要になるまで遅延させる「非正格評価」をとっているんだ!
  • 「非正格評価」と「遅延評価」は微妙に違うんだけど今んところは気にすんな!な!
  • Haskellは関数適用時に引数を評価しないかわりに「サンク」というものを渡すんだ!感謝しろ!
  • 関数の返り値ですらサンクになり得る事に気をつけろ
  • fst, sndは二項タプルにしか適用できないんだ。型を見ろ!
  • 純粋性は大事なんだ!とことんこだわるかんな!

ここが気になる

  • 変数名が小文字から始まるのなら、TrueとかFalseは一体何になるんだろうか?
  • 副作用を持つ関数は必ず型情報にIOが付くの? 副作用を持つ事と、型情報にIOが付く事は同等なの?
  • 変数束縛にletは要らないの?じゃあletは何?
  • 遅延評価でデバッグとかどうするんですかね?

練習問題

  • リストの最後から一つ前の要素を返すlastButOneを書け
lastButOne xs = if null (tail (tail(xs)))
                then head xs
                else lastButOne(tail xs)

lastButOne2 xs = head (tail (reverse xs))

追記(init関数というものがあるようです)

lastButOne3 xs = last (init xs)
  • lastButOneに短すぎるリストを渡すとどうなるか

先生!例外がでました!

*** Exception: Prelude.head: empty list

まとめ

遅延評価は確実にドツボにはまるであろう。