文字是一个特殊的表单值构造函数吗?

时间:2015-08-10 10:52:39

标签: haskell

data ListType = List Int Int Int deriving(Show)

[1, 2, 3]List 1 2 3,都可以获得包含一到三个的列表,我可以将文字视为值构造函数的特殊形式吗?

不只是Haskell的限制。

3 个答案:

答案 0 :(得分:2)

我不知道" literal"的含义,但您在上面定义的 List 数据类型实际上不是传统的Haskell列表。例如,你的" List"具有固定数量的元素(3),而Haskell列表可以包含从零到无限数量的元素。您的类型也专用于Int类型,而Haskell列表可以包含任何类型的元素,只要所有元素属于同一类型。此外,Haskell列表是许多类型类的实例(Functors,Monoids,Monads等)。

Haskell列表是一种递归数据类型,它们的可能构造函数是:

data List a = Empty | Cons a (List a) deriving Show

您可以将此构造函数用作:

Cons 1 (Cons 2 (Cons 3 Empty))

当然,使用内置数据类型并将列表构建为更加实用:

[1,2,3]

另外,你对Haskell"中的限制是什么意思?

答案 1 :(得分:2)

Haskell允许列表的自定义语法,例如

[1,2,3]

这只是

的语法快捷方式
1 : 2 : 3 : []

这是

的另一个语法快捷方式
(:) 1 ((:) 2 ((:) 3 []))

以上,(:)[]是数据构造函数。

(:) :: a -> [a] -> [a]
[]  :: [a]

请记住,特殊语法仅适用于标准列表,而不适用于用户定义的类型。你可以得到一些与之相似的东西。

data MyList a = Nil | a :+ MyList a

然后以中缀方式使用:+值构造函数:

1 :+ 2 :+ 3 :+ Nil

此类型没有[1,2,3]语法。

答案 2 :(得分:2)

  

我可以将文字视为值构造函数的特殊形式吗?

基本上,是的。但请注意,您的ListType不是列表;它(相当于)一个元组。列表类型的值可以包含任意数量的元素,而ListType值只能包含三个元素。不过回到你的问题:[1, 2, 3]确实是1 : 2 : 3 : []的语法糖,其中(:)[]构造函数显式出现。如果不是糖和其他语法细节,列表类型的定义可能是:

data [] a = [] | (:) a ([] a)