Skip to content
2009/03/02 / highmt

OCamlの多相ヴァリアントの推論って微妙ではないだろうか

よく事情を知らないので怖いもの知らずにいってみるのだけれども
OCamlの多相ヴァリアントの推論って微妙ではなかろうか。

# let func1 = function
    `A -> "A"
  | `B -> "B"
  ;;
val func1 : [< `A | `B ] -> string = <fun>

で、

# let func2 = function
    `C -> "C"
  | x  -> func1 x
  ;;
This expression has type [> `C ] but is here used with type [< `A | `B ]

これはどうなんだろう?

確かに[< `A | `B ]に[> `C ]を渡すのはまずいけれど、
この場合は[< `A | `B | `C ]だと思うのだけれど。
推論の方向が問題なんだろうか。

広告

2件のコメント

  1. Unknown / 3月 14 2009 01:56

    私も詳しくはわかりませんが、func2に[< `A | `B | `C ]を推論するためには、「func2の実装状況を解析した結果func1には[< `A | `B ]しか渡されないはず」という、なにか型以上のものを判定しなくてはならず、これができないのが直感と食い違うんじゃないでしょうか?例えば、次の例だとfunc2に[< `A | `B | `C ]を推論するとまずいですよね。let func2 x = function `C when x -> "C" | x -> func1 x

  2. ttakaya / 3月 18 2009 03:34

    なるほどー。func2 false `C なら Match_failure 、というわけにもいかないですね。

コメントは停止中です。

%d人のブロガーが「いいね」をつけました。