私は意図的に私はxとyの引数は、まだタイプ」のあることを期待していたこれらの引数がユニット型を持つと推測されたのはなぜですか?
let myMax x y =
if x > y then x else y
x
、この関数の最後にxを追加しましたが、私が代わりにこの署名を取得する:
myMax : x:unit -> y:unit -> unit
なぜこれらをユニット型を持つと推論される引数?
編集: 回答には@gillesありがとうございます。次の2つの機能を考慮してください。
let foo x y =
0 // warning
x
val foo : x:'a -> y:'b -> 'a
let foo2 x y =
if x > y then x else y // no warning
x
val foo2 : x:unit -> y:unit -> unit
2つのシグネチャはどう違うのですか? のは、単純な例を書いてみましょう第二の機能では、コンパイラは、x -either比較の結果を解釈するか、ユニット
私はまた、あなたが 'ignore'を使用して自分自身を見つける場合は、チャンスは、あなたが何か間違ったことをやっていることを追加します。この特定の例は、例外でもありません。戻り値が破棄され、副作用が発生しないため、 'if-then'式は意味を持ちません。 –