【问题标题】:Let Bindings Type Inference让绑定类型推断
【发布时间】:2018-08-15 16:50:22
【问题描述】:

我在 F# 中有以下代码:

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

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

【问题讨论】:

  • .net 中没有null 类型,它包含所有引用类型,包括string。所以value的类型是string

标签: .net types f#


【解决方案1】:

在这种情况下,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 -&gt; 'r,而在函数内部,value 的类型为'r

在无法将类型“提升”到封闭函数的情况下,将生成编译时警告,并且类型将固定为obj - 所有类型的超类型。为避免这种情况,您可以提供类型注释来解决歧义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多