ラムダ計算で代数的データ型を表現する方法
パターンマッチ = 「データコンストラクタを他の関数に置き換えること」
パターンマッチによって,Leftがlに置き換わります。以下同様です。
「データコンストラクタを置き換える」という概念について,もう少し詳しく考えていきます。
データコンストラクタの置き換え方は2種類ある
リストのような再帰的なデータ型では,データコンストラクタの置き換え方が2種類あります。
data List a = Cons a (List a) | Nil
(2) 最初のデータコンストラクタを置換する
それぞれの置き換え方をラムダ計算で表現すると,以下のようになります。
(1) 全てのデータコンストラクタを置換する
(2) 最初のデータコンストラクタを置換する
ラムダ計算で再帰的なデータ型を表現する2種類の方法には,それぞれ名前がついています。
「(1) 全てのデータコンストラクタを置換する」はチャーチエンコーディング(Church encoding)と呼ばれます。
「(2) 最初のデータコンストラクタを置換する」はスコットエンコーディング(Scott encoding)と呼ばれます。
チャーチエンコーディングで表現されたリスト
[] = λc n. n [1] = λc n. c 1 n [1,2] = λc n. c 1 (c 2 n) [1,2,3] = λc n. c 1 (c 2 (c 3 n))
スコットエンコーディングで表現されたリスト
[] = λc n. n [1] = λc n. c 1 (λc n. n) [1,2] = λc n. c 1 (λc n. c 2 (λc n. n)) [1,2,3] = λc n. c 1 (λc n. c 2 (λc n. c 3 (λc n. n)))
ラムダ計算で自然数
自然数も代数的データ型で定義できます。
data Nat = Succ Nat | Zero
チャーチエンコーディングの型
チャーチエンコーディングによって代数的データ型をラムダ計算で表現すると,以下のような型が現れます。
チャーチエンコーディングで現れた型は,型コンストラクタやデータコンストラクタの"名前"の情報を持っていません。これらの型が持っている情報は,データ型の構造的な特徴のみです。
参考文献
Bernie's notes on the Scott encoding
Directly Reflective Meta-Programming (9ページ目の「5.1 The Church Encoding」以降)