1

3番目の関数が機能しない理由について私は困惑しています:

   let generate1 = id
   let generate2 = let a = 1
                   id
   let generate3 = printfn "hi"
                   id

最初の2つは問題ありませんが、最後の2つは吐き出します

error FS0030: Value restriction. The value 'generate3' has been inferred to have generic type
    val generate3 : ('_a -> '_a)    
Either make the arguments to 'generate3' explicit or, if you do not intend for it to be generic, add a type annotation.
4

1 に答える 1

6

値の制限については説明しませんが、これら3つの値の意味の違いを整理しようとします。

generate1はのエイリアスにすぎないidので、問題ありません。

generate3を返す前にいくつかの計算をid行い、値の制限に達します。

では、なぜgenerate2のように値の制限に達しないのgenerate3ですか?コンパイラーは、これlet x = 1 in idが意味的には定数式でありid、式の本体では使用されていないことを意味的に認識できるため、コンパイラーはそれらを破棄できます。一方、(純粋ですが、コンパイラーはそれを証明できません)のような潜在的な副作用に置き換えると、コンパイラーは式を安全に減らすことができず、のように値の制限にぶつかります。1xlet ... in ...1sin 2.3singenerate3

于 2012-07-29T14:31:27.577 に答える