你能解释为什么一个有效而另一个无效吗?
给定
//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 dataisobj或'a为什么类型pis 'a -> unitwhen datawas obj?