1

我对为什么第三个功能不起作用感到困惑:

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

虽然前两个很好,最后一个吐出来

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

我不会尝试解释值限制,但我会尝试理清这三个值之间的语义差异。

generate1只是 的别名id,所以我们很好。

generate3在返回之前进行一些计算id,达到值限制。

那为什么不generate2达到价值限制generate3呢?因为编译器可以看到这let x = 1 in id在语义上等同于id:1是一个常量表达式并且x没有在let ... in ...表达式的主体中使用,所以编译器可以并且确实将它们丢弃。另一方面,如果您用(是纯的,但编译器无法证明) 之1类的潜在副作用替换,则编译器无法安全地减少表达式,从而像 with 一样达到值限制。sin 2.3singenerate3

于 2012-07-29T14:31:27.577 回答