让绑定类型推断

时间:2018-03-07 14:32:30

标签: .net types f#

我在F#中有以下代码:

let value = NSUserDefaults.StandardUserDefaults.StringForKey("type")
if value <> null then 
   //we know type is not null

此处我没有为value指定类型。但是,由于F#是静态类型语言,因此编译器必须在编译期间为每个构造推导出精确类型。在此特定情况下,值为nullString。编译器如何处理这个?在运行时分配给值的类型是什么?

1 个答案:

答案 0 :(得分:2)

在这种情况下,value的类型将是StringForKey函数返回的任何类型。如果定义该函数返回string,则值为string

函数可能在返回类型中是多态的,例如:

let f (x: string) : 'r = ...

此处,f的返回类型将是调用者选择的某种类型'r。在这种情况下,value的类型将根据您使用它执行的其他操作来确定,例如:

let value = f "abc"
let value2 = value + 2

这里,由于value被用作(+)的操作数,其中第二个操作数是整数(类型int),那么value本身也必须是一个int,因此f的通用参数也必须是int

如果无法确定value的类型,但它会影响封闭函数的类型,则封闭函数将变为通用:

let g() = 
    let value = f "abc"
    value

此处,函数g本身将获得一个通用参数,其类型为unit -> 'r,在函数内部,value将具有'r类型。

在不能如此推广类型的情况下&#34;对于封闭函数,将生成编译时警告,类型将固定为obj - 所有类型的超类型。为避免这种情况,您可以提供类型注释来解决歧义。