【发布时间】:2016-04-16 10:45:44
【问题描述】:
值限制错误:
let myFn (s : string) (args : obj seq) = ()
let myOtherFn = myFn ""
无值限制错误:
let myFn (s : string) (args : obj list) = ()
let myOtherFn = myFn ""
为什么?
【问题讨论】:
标签: 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 ""
为什么?
【问题讨论】:
标签: f# type-inference value-restriction
所有绑定都是automatic generalization 的主题。
由于seq<'T> 是一个接口(IEnumrable 的别名),myOtherFn 的推断类型将是val myOtherFn : ('_a -> unit) when '_a :> seq<obj>
这是通用的,然而,myOtherFn 不是函数声明(阅读上面链接中的 Value Restriction 部分),因此自动泛化无法推断这与 val myOtherFn : seq<obj> -> unit 相同。
要强制自动泛化,您可以向 myOtherFn 添加显式参数let myOtherFn args = myFn "" args
【讨论】:
obj ResizeArray代替列表,它也会给出值限制错误。