let rec の型推論と多相型
やっぱり specialize 挟んでも推論一発で終わるっていうのは嘘な気がするし、自前の推論器で型がおかしくなるケースは作れた。@mayahjp さんを質問攻めにする会が必要!
2010-11-17 08:06:48@pi8027 これぐらい何の問題もなく推論できると思うんですけど、どういう結果がでてるんでしょう。というか github から source 落としてきて走らせればいいのか
2010-11-17 13:20:10@mayahjp 上から調べていくので、下に定義のある名前の型を取ってこれないのです。もし上手く順序を入れ替えたとしても、一部の再帰関数などで同じ現象が起きる気がします。
2010-11-17 15:52:30@pi8027 @mayahjp 構文解釈木の任意の部分式の型をunifyで特殊化していくんだよね? < 上から調べていくので、下に定義のある名前の型を取ってこれないのです。
2010-11-17 17:56:12@pi8027 @mayahjp でもlet多相にしたかったら、その操作の前に letを展開する操作が必要なんじゃないかな
2010-11-17 17:57:12@pi8027 @mayahjp ところでgistにあるコードの # は case ... of と思えば良い?
2010-11-17 17:59:10@pi8027 @mayahjp とここまで書いて、letrec の多相はどうやるんだかちゃんと分かっていないことに気がついた
2010-11-17 18:09:41fresh な型変数aを与えておいて、bodyを推論し、単一化終わった後のS(a)をgeneralizeする。 RT @khibino: @pi8027 @mayahjp とここまで書いて、letrec の多相はどうやるんだかちゃんと分かっていないことに気がついた
2010-11-17 18:19:21おお、ありがとうございます。< @camlspotter fresh な型変数aを与えておいて、bodyを推論し、単一化終わった後のS(a)をgeneralizeする。RT @khibino: @pi8027 @mayahjp .. letrec の多相はどうやるんだか ..
2010-11-17 18:29:41副作用があるとS(a)の計算が要らなくて超クールなのですが。cf ocaml RT @khibino: おお、ありがとうございます。< @camlspotter fresh な型変数aを与えておいて、bodyを推論し、単一化終わった後のS(a)をgeneralizeする。
2010-11-17 18:33:11unifyを型変数への代入で、ということですよね。初めて見たときはちょっと感動しました RT @camlspotter 副作用があるとS(a)の計算が要らなくて超クールなのですが。cf ocaml RT @khibino: おお、ありがとうございます。
2010-11-17 18:38:52pure ではそのへんをどう頑張るか、なんか研究あったと思いますが、わざわざ自縛したうえでの競争なんで興味が持てず。まあ普通でいいんじゃん、はじめは。 RT @khibino: unifyを型変数への代入で、ということですよね。初めて見たときはちょっと感動しました
2010-11-17 18:43:42ごめん、body は definition ね。in の後の式じゃないよ。 RT @camlspotter: fresh な型変数aを与えておいて、bodyを推論し、単一化終わった後のS(a)をgeneralizeする。
2010-11-17 19:06:27了解です RT @camlspotter ごめん、body は definition ね。in の後の式じゃないよ。 RT @camlspotter: fresh な型変数aを与えておいて、bodyを推論し、単一化終わった後のS(a)をgeneralizeする。
2010-11-17 19:14:17@khibino @camlspotter @pi8027 おっと、みていない間にこんなに。let rec はそれでいいんですが、let rec id x = x and hoge () = id 1 みたいにすると、id は int -> int と推論されてしまう。
2010-11-17 19:17:59@khibino @camlspotter @pi8027 で、@pi8027 さんのやつは let rec でつなぐと id の型が残念になってしまうので (多相型じゃなくなる)、ちょっと違うことをやらないといけない。まあ単純に Haskell の型推論なんですが。
2010-11-17 19:20:28こういうことですね。 # let rec id : 'a. 'a -> 'a = fun x -> x and hoge () = id 1;; val id : 'a -> 'a = <fun> val hoge : unit -> int = <fun>
2010-11-17 19:30:48うーん、OCamlと同じやりかたでは多相にできないんですね ... @osiire @mayahjp @khibino @camlspotter @pi8027
2010-11-17 19:39:41