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就是一个有趣的例子。价值限制和可证明的无副作用之间的联系对我来说并不微不足道。我不会把这样的错误信息放在我的脑海里。