soutaroのHaskellにっき

2006-06-12

Polymorphic Recursion Polymorphic Recursion - soutaroのHaskellにっき を含むブックマーク はてなブックマーク - Polymorphic Recursion - soutaroのHaskellにっき

Haskellのwhere以下は相互再帰的に処理される。

OCamlのletはデフォルト再帰関数を定義できないのでちょっとびっくり。大丈夫なんかな。というのは、ML多相の範疇では、再帰関数は定義の中では多相的に利用できないから。多相性が制限され過ぎそうな気がしてしまう。

実は、HaskellはPolymorphic Recursionがあるので大丈夫。再帰関数も多相型が推論される。

module Main where

main = do
	print $ f 1
	print $ g "b"

id' x = x

f x = id' 1 + x
g x = id' "a" ++ x

ここで、id'がfとgの中でそれぞれ多相的に利用されていることがポイント

OCamlで同じプログラムにしようとして、

let rec id' x = x
and f x = id' 1 + x
and g x = id' "a" ^ "b"

let _ = begin
  Printf.printf "%d\n" (f 1);
  Printf.printf "%s\n" (g "b");
end

としてもエラーになる。

と思ったんだけど本当だろうか。上のプログラムだと、本質的には相互再帰的ではないので、順に宣言していくプログラムに書きなおせるはず。うーん、ちょっと気になるな。