seq <obj>的F#值限制但不列出<obj>?

时间:2016-01-11 23:41:34

标签: f# type-inference value-restriction

价值限制错误:

let myFn (s : string) (args : obj seq) = ()
let myOtherFn = myFn ""

没有价值限制错误:

let myFn (s : string) (args : obj list) = ()
let myOtherFn = myFn ""

为什么?

1 个答案:

答案 0 :(得分:4)

所有绑定都是automatic generalization的主题。

由于seq<'T>是一个接口(IEnumrable的别名),myOtherFn的推断类型将是
val myOtherFn : ('_a -> unit) when '_a :> seq<obj>
这是通用的,但是,myOtherFn不是函数声明(在上面的链接中读取值限制部分),因此自动泛化不能推断出它与val myOtherFn : seq<obj> -> unit相同。

要强制自动泛化,您可以向myOtherFn添加显式参数 let myOtherFn args = myFn "" args