你能解释为什么一个有效而另一个无效吗?
给定
//fu : unit -> unit
let fu() = ();;
这有效
//exec : (unit -> unit) -> int -> unit
let exec (f:(unit -> unit)) (data:int) = f();;
//this works, and p : int -> unit
let p = exec fu;;
它适用于其他类型,data
例如string
,long
等。
这不起作用
//exec : (unit -> unit) -> obj -> unit
let exec (f:(unit -> unit)) (data:obj) = f();;
let p = exec fu;;
我收到以下错误:
错误 FS0030:值限制。值 'p' 已被推断为具有泛型类型 val p : ('_a -> unit)
或者使 'p' 的参数显式,或者,如果您不希望它是泛型的,则添加类型注释。
请注意,这些情况之间的唯一区别是data
参数的类型。当它是obj
或System.Object
或'a
- 它不起作用。
另一件事是,如果data
有类型,obj
那么会发生以下情况:
//Data type is obj
let exec (f:(unit -> unit)) (data:obj) = f();;
//specifying parameters explicitly
let p x = exec fu x;;
现在p
有签名'a -> unit
,不是obj -> unit
。
所以问题是:为什么“快捷”currying 不起作用 when data
isobj
或'a
为什么类型p
is 'a -> unit
when data
was obj
?