iso- と equi- と OCaml の再帰型
@m2ym let recを使わない不動点演算子なら @camlspotter さんの fix2 が回答なんじゃないかと(さっきはideone閲覧できなかった)。再帰型を許すなら再帰的なデータ構造を構成できるってことなので、関数型言語ならそれを利用して再帰関数なりYを作れる
2011-02-01 14:59:40@camlspotter @keigoi Wikipediaのやつで確かに不動点演算子が定義できました。どうもありがとうございます。In, outがroll, unrollの操作に対応するわけですね。ただ、このバリアントに関してはいまだに釈然としないところがありまして…
2011-02-01 15:02:32@m2ym 例えば型aのリストlist = a * list + nil は F(X)=a*X + nil の不動点 μt.(a*t + nil)と等しいですよね。再帰型の宣言は実際にはそういう型構成子の不動点を宣言してると思えば。型付けとは別の、意味論の話なんでしょうね
2011-02-01 15:20:09@m2ym さかいさんがHaskellの再帰は最大不動点だとかおっしゃっていたような気がするけどそのへんもググればでてくるのでは
2011-02-01 15:21:04@keigoi type t = t -> intは何らかの理由でダメだけど、type t = T of (t -> int)は再帰型と見做していいよっていう話ですよね
2011-02-01 15:28:08@m2ym -rectypesもlet rec構文も使わず再帰関数を定義できます。 http://d.hatena.ne.jp/yoshihiro503/20100724#p1 #ocaml
2011-02-01 15:28:21@m2ym その話がどう関係するのかよくわからないです。単に前者はequi-recursive型だから-rectypesが無いと駄目というだけの話かなと。何度もいうように型付けの話であって再帰の意味がどうという話とは違うのかなと私は思ってます。間違ってる可能性もかなりありますけど
2011-02-01 16:09:11@keigoi すみません、初歩的な質問なんですがtype t = t -> intはequi-recursiveなんですか?この等号ってequi-recursiveの等号ではなく、正規木を連立方程式に変換したときの等号のようですが(「プログラミング言語の基礎理論」によると)
2011-02-01 16:21:59@m2ym 私の理解ですけど、再帰型t=t->intを、type t = T of t -> int と宣言すると、この型tをt->intとして扱うためにはパターンマッチでTを外す操作しないと駄目ですよね。それがiso-recursiveという再帰型の型付けの方法だと思ってます
2011-02-01 16:32:37@m2ym 一方, type t=t->int という定義は t と t->int を同一視できる(=equi-recursive).
2011-02-01 16:35:59@m2ym 構造だけ見れば type t=T of t->int と type t=t->int は同じだけど、型tとt->intを等しくするためには何か操作を間にはさまないといけない前者がiso-で、tとt->intを等しいとする後者がequi-recursiveな型付け
2011-02-01 16:40:10@keigoi 先の話だとtype t = t -> intでtはμα.α->intという型を持ちますよね。そのとき、μα.α->intと(μα.α->int)->intを等価と見做すかどうかは、その定義では決まらないと思うのですが、どうなんでしょう
2011-02-01 16:45:56@m2ym 等価とみなすかどうかは型の定義うんぬんではなくどういう型システムを選ぶかで決まります。 rectypesはequi-recursiveな型システムを有効にするので t=t->tみたいな型の等価性を許すのです。結果としてtype t=t->tみたいな型宣言も可能になる
2011-02-01 16:49:11ラベル付きバリアントとラベル無しバリアントって本質的に型付けが違うんだっけ。同じならtype t = t -> intもtype t = T of (t -> int)も同じ型になるはず?
2011-02-01 16:49:54ラベル無しバリアントなどない。前者はエイリアスを導入しているだけで、文字通り同一視するという意味ですよ QT @m2ym: ラベル付きバリアントとラベル無しバリアントって… 同じならtype t = t -> intもtype t = T of (t -> int)
2011-02-01 16:54:08