【问题标题】:What does the : infix operator do in Haskell?: 中缀运算符在 Haskell 中做了什么?
【发布时间】:2016-02-12 05:53:24
【问题描述】:

我正在阅读A Gentle Introduction to Haskell(不是那么温和),它反复使用: 运算符,而没有直接解释它的作用。

那么,它到底是做什么的呢?

【问题讨论】:

  • 一点都不温柔。如果这是你第一次接触函数式编程,我推荐这个网站:learnyouahaskell.com 阅读完这个网站后,回到 A Gentle Introduction。它真的让路很顺畅。

标签: haskell


【解决方案1】:

: 是“前置”运算符:

x : xs

返回一个列表,其中x 作为第一个元素,然后是xs 中的所有元素。在其他函数式语言中,这通常称为cons,因为它通过从一个空列表中重复应用递归地“构造”一个​​列表:

1 : 2 : 3 : 4 : []

是列表[1, 2, 3, 4]

【讨论】:

  • 这与连接列表的++ 运算符有何不同?
  • @dlkulp ++ 将一个列表连接到另一个列表。对于:,第一个参数是a 类型(任意类型),第二个参数是[a] 类型,这是a 元素列表的类型。
  • 其实“cons”来源于LISP——“在计算机编程中,cons(/ˈkɒnz/或/ˈkɒns/)是Lisp编程语言的大多数方言中的基本功能。cons构造内存对象,它保存两个值或指向值的指针。这些对象称为 (cons) 单元格、conses、非原子 s 表达式 ("NATSes") 或 (cons) 对。"
  • @ChaosRules 是的,没错,但我的回答并没有什么不同。
【解决方案2】:

可以随时查看 GHCi/HUGS 中的类型,因为本教程的第一步鼓励您下载 GHC/HUGS。

Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]

从它们各自的类型,很容易推断出它们的用法。

PS:http://haskell.org/hoogle/ 太棒了。

【讨论】:

  • 为什么感谢您,先生!如果你下载 hoogle,你可以将它作为 ghc 中的一个函数来使用。它很甜。允许您按类型或函数名称搜索,而无需导入,以各种方式击败 :t。
  • 技术上 (:) 可以是 x (:) xs = xs 或 x (:) xs = xs ++ [x]
  • 我发现:i (有时)比:t 提供更多信息。 :i (:) 会给你data [] a = ... | a : [a]:i [] 会给你完整的列表定义,data [] a = [] | a : [a]
  • 在 hoogle 上找不到 (:)。为什么不呢?
【解决方案3】:

Haskell 中的 : 运算符是列表的构造函数。它将冒号之前的任何内容“cons”到它之后指定的列表中。

例如,整数列表是通过将每个数字'consing'到空列表中来制作的,例如;

名单[1,2,3,4] 可以如下构造:

  • 4 : [](将 4 加入空列表)
  • 3 : [4](将 3 加入包含 4 的列表中)
  • 2 : [3,4](将 2 加入到包含 3、4 的列表中)
  • 1 : [2,3,4](将 1 加入到包含 2、3、4 的列表中)

给你;

[1,2,3,4]

写得完整就是这样;

1 : 2 : 3 : 4 : []

【讨论】:

    【解决方案4】:

    它是列表的类型构造函数。它与JustLeft 等任何其他类型的构造函数没有什么不同,只是它是中缀的。有效的类型构造函数可以是以大写字母开头的单词,也可以是以冒号开头的符号。

    因此,您可以为自己的数据类型定义中缀构造函数。例如:

    data MyList a = a :> MyList a
                  | Empty
    

    在上面的代码中,我们定义了一个名为MyList 的类型,它有两个构造函数:第一个是一个看起来很奇怪的构造函数:>,它接受一个元素和另一个MyList a;第二个是空构造函数Empty,相当于Haskell 原生列表中的[]

    以上等价于:

    data MyList a = Cons a  (MyList a)
                  | Empty
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2014-11-18
      • 1970-01-01
      • 2017-12-20
      • 2016-07-22
      • 2013-09-15
      • 1970-01-01
      相关资源
      最近更新 更多