什么:中缀运算符在Haskell中做什么?

moo*_*moo 44 haskell

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

那么,究竟是做什么的呢?

Kon*_*lph 72

: 是"prepend"运算符:

x : xs
Run Code Online (Sandbox Code Playgroud)

返回一个列表,其中包含x第一个元素,后跟所有元素xs.在其他函数式语言中,通常会调用cons它,因为它"cons"通过从空列表重复应用来递归地填充列表:

1 : 2 : 3 : 4 : []
Run Code Online (Sandbox Code Playgroud)

是清单[1, 2, 3, 4].

  • @dlkulp` ++`将一个列表连接到另一个列表.使用`:`,第一个参数是类型`a`(任意类型),第二个参数是类型`[a]`,它是`a`元素列表的类型. (6认同)
  • 这与连接列表的“++”运算符有何不同? (3认同)

cod*_*iss 22

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

Prelude> :t (:)
(:) :: a -> [a] -> [a]
Prelude> :t (++)
(++) :: [a] -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我发现`:i`(有时)比`:t`更有用.`:我(:)`会给你`data [] a = ... | a:[a]`和`:i []`会给你完整的列表定义,`data [] a = [] | a:[a]`. (2认同)
  • 你在hoogle上找不到(:).为什么不? (2认同)

Cia*_*ran 16

Haskell中的:运算符是列表的构造函数.它是'缺点'冒号之前的任何内容都在它之后指定的列表中.

例如,通过将每个数字"提供"到空列表上来形成整数列表,例如;

该列表[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]
Run Code Online (Sandbox Code Playgroud)

完全写完了;

1 : 2 : 3 : 4 : []
Run Code Online (Sandbox Code Playgroud)


jbe*_*man 11

它是列表的类型构造函数.它是从任何其他类型的构造一样,没有不同JustLeft,不同之处在于它是缀.有效类型构造函数可以是以大写字母开头的单词,也可以是以冒号开头的符号.

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

data MyList a = a :> MyList a
              | Empty
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我们定义了一个MyList使用两个构造函数调用的类型:第一个是:>带有元素和另一个元素的奇怪构造函数MyList a; 第二个是空构造函数Empty,它等同[]于Haskell的本机列表.

以上相当于:

data MyList a = Cons a  (MyList a)
              | Empty
Run Code Online (Sandbox Code Playgroud)