【问题标题】:value restriction case in F#F#中的值限制案例
【发布时间】:2012-07-29 13:36:03
【问题描述】:

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

   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.

【问题讨论】:

    标签: f#


    【解决方案1】:

    我不会尝试explain value restriction,但我会尝试理清这三个值之间的语义差异。

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

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

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

    【讨论】:

    • 关于罪的有趣例子。价值限制和可证明的无副作用之间的联系对我来说并非微不足道。我不会把这样的错误信息我想。
    猜你喜欢
    • 2013-01-26
    • 2011-05-03
    • 2020-07-29
    • 2012-03-13
    • 1970-01-01
    • 2015-06-15
    • 2010-11-11
    相关资源
    最近更新 更多