【问题标题】:F# value restriction for seq<obj> but not list<obj>?seq<obj> 但不是 list<obj> 的 F# 值限制?
【发布时间】: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


    【解决方案1】:

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

    由于seq&lt;'T&gt; 是一个接口(IEnumrable 的别名),myOtherFn 的推断类型将是
    val myOtherFn : ('_a -&gt; unit) when '_a :&gt; seq&lt;obj&gt;
    这是通用的,然而,myOtherFn 不是函数声明(阅读上面链接中的 Value Restriction 部分),因此自动泛化无法推断这与 val myOtherFn : seq&lt;obj&gt; -&gt; unit 相同。

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

    【讨论】:

    • 这是原因,但相关的区别不是 seq 是一个接口,而是列表是密封的。使用例如obj ResizeArray代替列表,它也会给出值限制错误。
    猜你喜欢
    • 2020-06-30
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2010-11-18
    • 2019-01-13
    • 1970-01-01
    相关资源
    最近更新 更多