1:[]和[1]有什么区别?你将如何在Haskell中实现:和[]?

时间:2014-04-20 15:37:50

标签: haskell

什么是:?它是一个中缀值构造函数吗?

它的定义是什么?

我无法找到:的源代码。

另外,[ ]是什么?

[1]定义为简单 代数数据类型?如果是,怎么样?

是否像data [a] = a:[ ] | [ ]

这只是我的猜测。我不确定。

:[ ]的源代码是什么?

这些构造是否硬编码到编译器中?

让我们将:称为cons,将[ ]称为Nil。使用这些名称,您如何在Haskell中实现等效的:[ ]

1 个答案:

答案 0 :(得分:4)

:是一个List构造函数。

λ> :t (:)
(:) :: a -> [a] -> [a]
λ> 3 : [2,4]
[3,2,4]

1:[][1]是相同的。在第一种形式中,您已应用函数:来创建[1]

[]用于表示空列表。 []的另一种用法是作为类型构造函数。这用于创建Applicative等实例

实际上,当你写[1,2,3]之类的东西时,它是1:2:3:[]的语法糖。

感谢@ManuelEberl,您可以找到来源here.

您可以使用ConsNil创建自己的列表,如下所示:

data MyList a = Nil | Cons a (MyList a) deriving (Show)

它只需要一个递归结构来定义它。一些演示:

λ> Cons 3 Nil
Cons 3 Nil
λ> Cons 3 (Cons 3 Nil)
Cons 3 (Cons 3 Nil)

让我创建一个名为constructMyList的函数,它类似于:

constructMyList :: a -> MyList a -> MyList a
constructMyList x y = Cons x y 

它的演示:

λ> let a = Cons 2 (Cons 3 Nil)
λ> constructMyList 1 a
Cons 1 (Cons 2 (Cons 3 Nil))