関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。

本節は 関数 について。

要点は

  • 外延性
  • カリー化
  • 演算子と関数
  • 優先順位 結合順序
  • 関数合成

です

まず関数は値として扱えますが、表示することはできません。引数を適用することで表示できる場合があります。 また、関数は 引数の値 を戻り値 の型に変換する(対応をつける)役目をもちます。関数の型を示すには -> 演算子を使い 型A を受取り 型B を返す場合 A -> B とかきます。

関数 と 関数に値を適用したものを混同しないように気をつけたほうがよいそうです。

外延性

関数が等しい場合は任意のxに対し以下が成立します。

f x = g x

この方法は関数に値を適用した結果が一致するので 適用的証明 というそうです。また ポイントワイズスタイル ともいうそうです。このように f や g はブラックボックスですが、引数と結果で確認できるので外延性の原理

逆に定義から f = g を示す場合はポイントフリースタイルというそうです。ただし、効率が違う場合があり、これは内包的性質というそうです。

カリー化

単一の引数の関数の複数の引数に分解できます。こうすると関数に引数をひとつだけ適用すると新しい関数を作成することができます。結果が変わらないので括弧が減ったり、引数を変えるだけで様々な効果をもつ関数がつくれる利点があります。Arrow を使う場合は逆に アンカリー化をする場合もあります。

演算子と関数

演算子も実質的には2引数の関数ですが中置することができます。Haskellでは 括弧で演算子を囲むことで通常の関数にもできますし、関数をバッククォートで囲むことで演算子のように利用できます。また、括弧で演算子を囲む場合は (+1) のようにして あらかじめ引数を適用したりもできます。これをセクションというそうです。

優先順位 結合順序

これらのおかげで 括弧を省略することができます。 これらの把握しておかないとHaskellのコードを読む際によくわからなくなるのでしっかりと慣れておいたほうが良いです。

関数は最優先で左結合です。

f x y + z であれば ((f x) y) + z と等価です。

右結合か左結合か は演算子によって違いますが、どちらでも同じ結果になるものもあります。これを結合性というそうです。+ や * は結合性があります。

関数合成

関数合成は関数と関数を演算できます。結合性です。 ある関数の結果を別の関数の引数にできる場合に利用できます。 f (g x) が正しい場合 (f . g) x とできます。ドットは関数合成をする演算子です。

まとめ

練習問題は今回もHaskell のコードはあまりかきませんでした。

優先順位や結合順序はいままでなんとなくでやってましたが、改めて整理できたのでかなり Haskell のコードがよみやすくなりました。早めに習得しておきたいですね。

関連