再帰代数データ型と代数
なるほどなと思った
HaskellでのListデータ型の定義
data List A = Nil | Cons A (List A)
各項を以下の数式記号に、置き換える
- List A => L(A)
- a | b => a + b
- Nil => 1
- Cons A b => A × b
L(A) = 1 + A × L(A)
L(A)を左辺へまとめる
(1 - A) × L(A) = 1
係数で割る
L(A) = 1 / (1 - A)
テイラー展開する
L(A) = 1 + A + A^2 + A^3 + ...
各項は、
- A = A × 1
- A^2 = A × A × 1
- A^3 = A × A × A × 1
L(A) = 1 + A × 1 + A × A × 1 + A × A × A × 1 + ...
最初の変換を逆適用
- L(A) => List A
- a + b => a | b
- 1 => Nil
- A × b => Cons A b
List A = Nil | Cons A Nil | Cons A (Cons A Nil) | Cons A (Cons A (Cons A Nil)) | ...
あと、
- 微分 <=> データの各所に穴を開けたもの
らしく、Listの場合、
L(A) = 1 + A L(A)
両辺を微分すると、
L'(A) = L(A) + A L'(A)
かつ、両辺にL(A)をかけると、
L(A)^2 = L(A) + A L(A)^2
よって
L'(A) = L(A)^2
となり、Listに穴を開けるとList二つ組になるとのこと