在LYAHFGG中,有一章说该列表定义为:
data List a = Cons a (List a) deriving (Show, Read, Eq, Ord)
我理解除了缺点之外,大多数这意味着什么。当我在:t Cons
中尝试:i Cons
和ghci
时,我收到了一个不在范围内的错误。在本章后面,它还讨论了: - 和它与Cons
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
相同。这是一回事吗?我对这两个:
的意思,以及它是强制语法还是风格选择感到困惑。
答案 0 :(得分:8)
data List a = Cons a (List a) deriving (Show, Read, Eq, Ord)
我理解除了缺点之外,大多数这意味着什么。当我在
:t Cons
中尝试:i Cons
和ghci
时,我收到了一个不在范围内的错误。
您需要使用data
声明加载Haskell源文件,然后才能在作用域中使用Cons
。或者,您也可以直接在GHCi中输入data
行。
对于严肃的代码,如果将其放入文件并加载它会更容易。这是因为学习过程通常涉及稍微修改文件,重新加载文件,在GHCi中尝试一些测试,再次修改文件等。在GHCi中执行此操作非常麻烦。
无论如何,Cons
只是构造函数名称 - 它是一个任意名称。如果您愿意,可以使用data List a = Foobar a (List a) ....
并将其命名为Foobar
。 Cons
是一个历史名称,但源自Lisp。
:-:
是构造函数的另一个任意名称,除了可以使用 infix 。即而不是Cons 1 someList
可以写1 :-: someList
。
答案 1 :(得分:7)
:-:
只是数据构造函数的中缀名称。您可以看到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)))