関数プログラミング実践入門 【読書記録 2章】

\引数 -> 式

という形で記述する

  • Haskellではスペースが関数適用に対応する
  • GHCi上で変数に値を束縛するにはletを使う
  • Haskellではデータの型を明示的に指定する場合,値や変数に対してコロンを2つ::に続けて型を与える.これを型注釈と言う.
  • Haskellには厳密には「2引数関数」というものがない.なぜなら関数が第一級の対象,つまり関数が関数の結果になれるからである.
  • 関数が関数の結果の値になれない言語では,1つの引数を与えられただけでは関数という結果に至ることが出来ない.結果として引数すべてを与えて(関数ではない)値を取り出すことになる.
  • 関数が関数の結果の値になることで,1引数だけでn引数を表現出来る.
  • n引数関数を1引数関数だけで構成される形にすることを,カリー化という.Haskellの関数はカリー化されている.
  • 整数と小数点同士の足し算のとき
(1 :: Int) + (2 :: Double)
=>
<interactive>:37:15:
    Couldn't match expected type ‘Int’ with actual type ‘Double’
    In the second argument of ‘(+)’, namely ‘(2 :: Double)’
    In the expression: (1 :: Int) + (2 :: Double)
    In an equation for ‘it’: it = (1 :: Int) + (2 :: Double)

上記のようなエラーとなる.多くの言語では暗黙の型変換が行われ,このような足し算も問題なく通過する

  • Haskellでは暗黙の型変換が行われないようになっている.
  • タプルのように2つの型の組み合わせを作る型を直積型という.
  • Eitherのように2つの型の貼りあわせを作る型を直和型という.
  • Maybeは型を1つ包んでMaybe a型を作る型コンストラクタ.たとえばMaybe Stringという型は,有効なStringの値(Just)か,もしくは無効な値(Nothing)で表現される.
  • 再帰的な型の定義も可能.これまでの説明で既存の型と表現している部分は,今定義しようとしている自分自身の型もOK.
  • 代数データ型とは「直積で表されたいくつかの型を直和にした型」.2分木の型は次のように表せる.
data Tree a = Leaf a
            | Fork (a, (Tree a, Tree a))
  • 上記はすべての代数データ型に対する考察は,タプルとEitherに対する考察だけ行えば十分であることを示す,とても強力な特徴.実際にこのことを利用し,いくつかのHaskellライブラリではタプルとEitherに対する関数定義だけから,任意の代数データ型に対する関数定義を自動で導出するなどする.
  • readは型変数になっている部分が結果の型であるため,結果が何になるか型推論に足る材料がない場合,明示的に教える必要がある.