列表类型是用
data [] a = [] | a : [a]
但是我无法创建具有相同结构的自己的类型:
data %% a = %% | a : %a%
错误:输入 '%%' 时出现解析错误
列表类型是使用
data [] a = [] | a : [a]
不,不是。如果你看一下源代码(对于GHC;其他编译器可能会以不同的方式做(,它说
data [] a = MkNil
但这只是编译器的一个标记(甚至不是这个,请参阅切普纳的评论(。这是因为
data [] a = [] | a : [a]
不是哈斯克尔的法律语法。
事实是,列表的工作方式就像是这样定义的:它完全等同于
data List a = Nil | Cons a (List a)
除了名字。
类型和构造函数名称必须是字母数字名称,以大写开头
data MyType a b = K a | L b a
或者是符号中缀运算符,以 :
开头
data a :** b = K a | b :+-& a
上述两种类型都是完全同构的:我们只用中缀:**
替换了MyType
,用中缀:+-&
替换了L
。
另请注意,中缀必须是二进制的,即采用两个参数。字母数字名称没有这样的约束(例如 K
上面只接受一个参数(。
列表语法 []
由编译器专门处理,类似于元组的(,),(,,),...
。只有:
遵循一般规则(也许是偶然的(。