【问题标题】:Order of type constraints in F#F# 中类型约束的顺序
【发布时间】:2016-05-31 11:50:14
【问题描述】:

这适用于 F#4.0:

type Something<'a, 'b when 'b :> seq<'b>>() = 

这不是:

type Something<'b when 'b :> seq<'b>, 'a>() = 

类型名称中有意外的符号“,”。应为“>”或其他标记。

类型约束的顺序很重要的原因是什么?

【问题讨论】:

  • 等等! when 'b :&gt; seq&lt;'b&gt; ???这甚至意味着什么?

标签: f# type-constraints


【解决方案1】:

因为它在规范中 - 相关部分是这样的(从第 5 节开始):

typar-defns:= < typar-defn, ..., typar-defn typar-constraints_opt>

约束需要到最后。

在此typar-constraints 必须始终以when 开头,并且不能出现在其他任何地方。

【讨论】:

    【解决方案2】:

    类型约束和类型参数是两个不同的东西。在您的示例中,'a'b 是两个类型参数,when 'b :&gt; seq&lt;'b&gt; 是(唯一的)约束。

    现在,您编写第一个示例的方式似乎表明类型参数定义与类型约束有关,但这仅在外观上。注意这个(工作)代码:

    type Something<'b, 'a when 'b :> seq<'b>>() = 
      member this.A (a : 'a, b : 'b) =
        ()
    

    首先,您定义所有类型参数。之后才出现类型约束,并且约束仍然适用于'b,而不是'a - 虽然看起来有点混乱,但约束表达式不是 'a when 'b :&gt; seq&lt;'b&gt;,它只是@ 987654328@.

    这实际上与 C#(另一种 .NET 语言)几乎相同:

    public class Something<TA, TB> where TA: someConstraint where TB: someOtherConstraint
    

    C# 中的约束在视觉上更加独立,因此人们不会倾向于犯您在 F# 中犯的错误。

    【讨论】:

      【解决方案3】:

      除了上述答案之外,排序还允许约束依赖于多种类型。例如

      type Something<'a, 'b when 'b :> seq<'a>>() =
      

      注意:seq&lt;'a&gt; 不是seq&lt;'b&gt;

      【讨论】:

        猜你喜欢
        • 2016-11-13
        • 2012-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-18
        相关资源
        最近更新 更多