2017-01-09 14 views
0

LYAHFGG,一章说,列表定义为:缺点和: - Haskell中的意思是什么?

data List a = Cons a (List a) deriving (Show, Read, Eq, Ord) 

我明白这个最从缺点意味着分开。当我尝试:t Cons:i Consghci我得到一个不在范围内的错误。后来的章节中也谈到: - :和它是如何一样的缺点

infixr 5 :-: 
data List a = Empty | a :-: (List a) deriving (Show, Read, Eq, Ord) 

但我又实在不明白这是什么:-:意味着要么。

在另一资源,在有关数据类型的部分,它们限定以下数据类型:

data Expr = X 
     | Const Int 
     | Expr :+: Expr 
     | Expr :-: Expr 
     | Expr :*: Expr 
     | Expr :/: Expr 
     | IfZero Expr Expr Expr 
     deriving (Eq, Ord) 

IfZero p q r相同if p == 0 then q else r。这是一回事吗?我最困惑的是两个:是什么意思,如果它是强制语法或只是样式选择。

+2

我建议你阅读关于数据声明的语法。那些是构造函数。 –

+0

@ ThomasM.DuBuisson你可以建议任何资源?这些解释都不是很好 – user6731064

+1

我一直觉得wikibooks是一个低估的资源(https://en.wikibooks.org/wiki/Haskell/Type_declarations),但是LYAH确实有一章(http:// learnyouahaskell.com/making-our-own-types-and-typeclasses#algebraic-data-types)。 –

回答

5
data List a = Cons a (List a) deriving (Show, Read, Eq, Ord) 

我明白除了缺点之外,大部分的意思。当我尝试:t Cons:i Consghci我得到一个不在范围内的错误。

您需要先加载Haskell源文件并声明data,然后才能有Cons的范围。或者,您也可以直接在GHCi中输入该行data

对于严重的代码,如果将其放入文件并加载它会更容易。这是因为学习过程通常涉及修改文件,重新加载文件,在GHCi中尝试一些测试,再次修改文件等。在GHCi中执行此操作非常麻烦。

无论如何,Cons只是构造函数的名称 - 它是一个任意名称。如果您愿意,您可以使用data List a = Foobar a (List a) ....并将其命名为FoobarCons是一个历史悠久的名字,虽然源自Lisp。

:-:是构造函数的另一个任意名称,只是它可以使用中缀。即代替Cons 1 someList可以编写1 :-: someList

+0

嗯谢谢你,我开始怀疑这是在玩弄它。我觉得太多的咖啡和睡眠太少是一个坏主意。 – user6731064

4

:-:只是数据构造函数的中缀名称。你可以看到,data声明等同于

data List a = Empty | (:-:) a (List a) 

语义,存在使用(:-:)Cons没什么区别,但它的好得多阅读

1 :-: 2 :-: 3 :-: 4 :-: Empty 

比任何

Cons 1 (Cons 2 (Cons 3 (Cons 4 Empty))) 

1 `Cons` (2 `Cons` (3 `Cons` (4 `Cons` Empty))) 
+1

您也可以在中缀位置使用'Cons',只要它包含在反引号中即可。任何以':'开头的构造函数名称(如':'或': - :')都是特殊构造的中缀构造函数,并且不用将其封闭在反引号中。 – chepner

+0

@chepner当然,但反引号本身很烦人。 – pyon

+0

我无法在hoogle中找到': - :',而ghci似乎无法识别它。它与':'有什么不同? –