带
data ListType = List Int Int Int deriving(Show)
[1, 2, 3]
和List 1 2 3
,都可以获得包含一到三个的列表,我可以将文字视为值构造函数的特殊形式吗?
不只是Haskell的限制。
答案 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)