【问题标题】:OCaml difference between :: and @::和@之间的OCaml区别
【发布时间】:2014-02-05 23:49:55
【问题描述】:

我正在尝试将一个列表附加到另一个列表的末尾。通常的:: 运算符给我以下错误:

这个表达式的类型是 char list 但是需要一个 char 类型的表达式

在声明中

`(createList 0 5 'a')::['c';'d';'e';'f';'g']`
(* the following createList expression returns the list ['a';'a';'a';'a';'a'] *)

当我使用@ 运算符时,它会很好地附加列表;所以,我的问题是@:: 有什么区别?只是@ 在两个列表之间使用,而:: 在列表和非列表类型之间使用?

【问题讨论】:

    标签: functional-programming ocaml


    【解决方案1】:

    @ 连接两个列表('a list -> 'a list -> 'a list 类型),而:: 采用特定类型的元素并将其“前置”在包含完全相同类型元素的列表之前(即:: 具有类型@ 987654325@)。

    你基本上可以通过[a]@b模拟a::b

    请注意,@ 需要 OCaml 遍历给定的第一个列表以找到第一个列表的最后一个参数。这需要 O(n) 时间,其中 n 是第一个列表中的元素数。另一方面,:: 需要 O(1) 时间。

    关于你的例子(createList 0 5 'a')::['c';'d';'e';'f';'g']:

    (createList 0 5 'a') 创建一个包含'a's 的列表,即我们有char list 类型,['c';'d';'e';'f';'g'] 也是char list 类型。因此,您只能使用@ 连接它们(见上文),而:: 没有意义(见上文:: 的类型签名)。

    【讨论】:

      【解决方案2】:

      @ 是连接two lists

      ::是将an element添加到head of a list

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-30
        • 1970-01-01
        • 2021-12-25
        • 2020-05-10
        • 2014-09-20
        • 2010-10-28
        • 2015-10-04
        • 2012-08-12
        相关资源
        最近更新 更多