【问题标题】:Clarification of List<'T> definition syntax澄清 List<'T> 定义语法
【发布时间】:2015-03-16 18:08:16
【问题描述】:

在阅读F#的源码时,发现List&lt;'T&gt;类型的definition,长这样:

type List<'T> = 
       | ([])  :                  'T list
       | (::)  : Head: 'T * Tail: 'T list -> 'T list

有人能解释一下上面的语法吗?编译器警告说“此构造已弃用:它仅用于 F# 库”。语法只是定义有区别的联合的一种旧方法吗?如果是这样,为什么Tail 的类型是'T list -&gt; 'T list 而不仅仅是'T list

【问题讨论】:

    标签: f#


    【解决方案1】:

    我相信这意味着以下内容:

    type List<'T> = 
           | ([])  :                  'T list
           | (::)  : (Head: 'T * Tail: 'T list) -> 'T list
    

    也就是说,(::) 是一个函数,给定一个有序对 'T * 'T list 生成一个'T list

    不推荐使用的构造为可区分的联合构造函数提供类型注释。据我所知,在任何版本的 F# 中,您都不需要这样做。我不知道他们为什么必须在 F# 库中这样做。

    【讨论】:

    • 是否也等价于“type MyList = | ([]) of 'T list | (::) of Head: 'T * Tail: 'T list”?
    • 是的,在各个方面都是如此。只是原则上,(::) 是一个函数。
    • 好的,谢谢。我做了一个这样的测试类型:“type Test = | Case1 : int -> Test | Case2 : string -> Test”。尽管弃用警告仍然存在,但该类型按预期工作。 '让 test1 = Case1 (5)','让 test2 = Case2 ("test")'。我想你是对的 - 警告意味着我们应该使用“Case1 of int”而不是“Case1 : int -> Test”。再次感谢。
    • (::) 是可以构造列表的函数,也是可以在模式匹配期间使用的模式
    猜你喜欢
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多