使用
创建列表类型data [] a = [] | a : [a]
但我无法使用相同的结构创建自己的类型:
data %% a = %% | a : %a%
错误:输入'%%'
时解析错误
答案 0 :(得分:4)
使用
创建列表类型.conflist
不,不是。如果你看the source(对于GHC;其他编译器可能采用不同的方式),它会说
data [] a = [] | a : [a]
但这只是编译器的标记(甚至不是这个,请参阅chepner的评论)。这是因为
data [] a = MkNil
在Haskell中不是合法语法。
真实情况是该列表就像一样以这种方式定义:它完全等同于
data [] a = [] | a : [a]
除名字外。
答案 1 :(得分:1)
类型和构造函数名称必须是字母数字名称,以大写
开头data MyType a b = K a | L b a
或者是符号中缀运算符,以:
data a :** b = K a | b :+-& a
上述两种类型完全同构:我们仅使用中缀MyType
替换:**
,使用中缀L
替换:+-&
。
还要注意,中缀必须是二进制的,即取两个参数。字母数字名称没有这样的约束(例如,上面的K
只接受一个参数)。
列表语法[]
由编译器专门处理,类似于元组的(,),(,,),...
。只有:
遵循一般规则(可能偶然)。