http://d.hatena.ne.jp/m-a-o/20061030
でも書いたLFixとGFixが相変わらずよく理解できなかったり。Wadlerのノートを読み返すと、これは必ずしも自明なもんでもないらしく、論文にもなっているようだけど、論文が入手できん、むー。こういう時、困るなぁ。が、LFixの定義よく見ると、fold(の型)とよく似ている。foldの定義はいい加減目に焼きついた

Lfix X.F X = All X. (F X -> X) -> X.
fold :: forall f.(Functor f) => (forall x.(f x -> x) -> (Fix f) -> x)

flip fold :: forall f.(Functor f) => (Fix f) -> (forall x.(f x -> x)->x)
なので、うまく、(Fix f)から(forall x.(f x -> x) -> x)への写像がつくれる。で、これが一対一対応(という集合論に毒された言い方が正しいのかどうかは知らんが)かどうかなんだけど、今の私にはちょっとよくわからん。


GFixの方も平行して議論できそうだけど、こっちは

Gfix X.F X = Exists X. (X -> F X) * X.
unfold :: forall f.(Functor f) => (forall x.(x -> f x) -> x -> (Fix f))
uncurry unfold :: forall f.(Functor f) => (forall x.(x -> f x , x)) -> (Fix f)

えー、Existsってなんやねーん。まあ、こいつらが関係ないってことはないでしょ、常識的に考えて


あと、自然数のChurch Encoding。
Nat = forall x.(x -> x) -> x -> x
は証明を要するんじゃないのかなー。Natから右辺への写像が存在して、単射なのはいいとして、全射だって、どうやって言うんだろ(いや、2階ラムダ計算の教科書には書いてるのかもしれんけど)