我在F#中有以下代码:
let value = NSUserDefaults.StandardUserDefaults.StringForKey("type")
if value <> null then
//we know type is not null
此处我没有为value
指定类型。但是,由于F#是静态类型语言,因此编译器必须在编译期间为每个构造推导出精确类型。在此特定情况下,值为null
或String
。编译器如何处理这个?在运行时分配给值的类型是什么?
答案 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
- 所有类型的超类型。为避免这种情况,您可以提供类型注释来解决歧义。