【问题标题】:F# Type inference with curried functions使用柯里化函数进行 F# 类型推断
【发布时间】:2015-01-02 15:07:57
【问题描述】:

我有以下代码

let bar foo baz = foo, baz 

let z = bar 3
let z1 = z 2

但是如果我注释掉最后一行 let z1 = z 2 我会得到一个错误

let z = bar 3
----^

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

我完全不知道如何正确注释函数。

【问题讨论】:

    标签: types f# type-inference


    【解决方案1】:

    您在这里面临的是 F# 的一个方面,称为 值限制。这实质上意味着,如果你定义一个在语法上不是函数的值,那么它就不能是泛型的。

    let bar foo baz = foo, baz
    

    ... 在语法上是一个函数(它显然有两个参数),因此它被推断为泛型。然而:

    let z = bar 3
    

    ... 在语法上不是一个函数——它只是一个值 z 恰好是一个函数(因为这就是 bar 的类型所表示的)。所以,这不能是通用的。在您的 sn-p 中,通用性受到下一行的限制:

    let z1 = z 2
    

    这将z 的类型固定为int -> int * int。如果你没有这行,你可以自己修复类型:

    let z : int -> int * int = bar 3
    

    或者,您可以将其设为可推断为通用的句法函数:

    let z a = bar 3 a
    

    有关更多信息,请搜索讨论 value restriction 的各种其他 SO 问题和答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-26
      • 2020-08-20
      • 1970-01-01
      • 2021-06-13
      • 2020-08-18
      • 1970-01-01
      • 1970-01-01
      • 2015-10-15
      相关资源
      最近更新 更多