F# F中的值限制情况#
我不明白为什么第三个功能不起作用:F# F中的值限制情况#,f#,F#,我不明白为什么第三个功能不起作用: 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 t
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.
我不会尝试,但我会尝试整理这三个值之间的语义差异
generate1
只是id
的别名,所以我们在这方面做得很好
generate3
在返回id
之前执行一些计算,点击值限制
那么为什么generate2
没有像generate3
那样命中值限制呢?因为编译器可以看到id中的let x=1
在语义上等同于id
:1
是一个常量表达式,x
未在let的主体中使用。。。在…
表达式中,因此编译器可以并且确实会丢弃它们。另一方面,如果将1
替换为潜在的副作用,如sin2.3
(sin
是纯的,但编译器无法证明它),那么编译器无法安全地减少表达式,从而达到与generate3
相同的值限制,我不会尝试,但我将尝试整理这三个值之间的语义差异
generate1
只是id
的别名,所以我们在这方面做得很好
generate3
在返回id
之前执行一些计算,点击值限制
那么为什么
generate2
没有像generate3
那样命中值限制呢?因为编译器可以看到id中的let x=1
在语义上等同于id
:1
是一个常量表达式,x
未在let的主体中使用。。。在…
表达式中,因此编译器可以并且确实会丢弃它们。另一方面,如果将1
替换为潜在的副作用,如sin2.3
(sin
是纯的,但编译器无法证明),那么编译器就无法安全地减少表达式,因此,使用sin来达到值限制,如使用sin的generate3
有趣的示例。价值限制和可证明的无副作用之间的联系对我来说并不微不足道。我不会把这样的错误信息放在methink上。sin就是一个有趣的例子。价值限制和可证明的无副作用之间的联系对我来说并不微不足道。我不会把这样的错误信息放在我的脑海里。