関数型プログラミングとモナド
- 6. 合成手段の例
? 演算の合成
– y = f(x), z=g(y) ? z = (f ○ g)(x)
? 繰り返し適用
– z = fold(3,f,x) ? z = f(f(f(x)))
– z = map(f,[x,y,z]) ? z = [f(x),f(y),f(z)]
? ちなみに分解手段もある(例:カリー化)
– z = f(x,y) ? z = fc(x)(y)
? 「演算」と「合成?分解手段(=高階関数)」
によって割と自由にプログラミングできる!
- 8. 多相データ型 と 型クラス
?多相データ型: コンテナ型のようなもの。Enumのような定数値も含む。
単純な例) リスト a
aにはintとかfloatとかcharとか、あるいはリストのリストならば 「a = リスト b」となる。
再帰構造の例) 2分木ツリー a
aの型を要素に持つ2分木ツリーコンテナのようなもの。
雑多な例) くじ引き型 a b
aは当選商品のEnum型、bはハズレくじを集めて再チャンス応募の商品のEnum型
?型クラス: 通常のデータ型や多相データ型に対して、適用可能な関数を
保証する型
例) 合計を計算できる型クラス(CanTotal)というのを定義してみる
クラス CanTotal
定義:
関数 total(x) を持つこと
- 9. 型クラスのインスタンスによるオーバーロード
入力(x)
リスト total(x,y) 二分木 total(x) 他 total(x)
total(x) ? 選択機構
?型クラスのインスタンス: あるデータ型(基本型 or データ多相型)がその
型クラスが規定する関数の定義を持つこと
例1) リスト a 型はCanTotal型クラスのインスタンスであると定義できる。
定義: 引数xをリストa型のデータとしたとき、
total(x) = xに含まれるa型の要素を合計する
例2) 二分木a型はCanTotal型クラスのインスタンスであると定義できる。
定義: 引数xを二分木a型のデータとしたとき、
total(x) = xに含まれるa型の要素を合計する
? これで、totalという関数は、上図のように選択機構がうまく働く。
(オーバーロード または アドホック多相 と呼ぶ)