使用双符号创建类型

时间:2018-03-14 12:45:06

标签: haskell

使用

创建列表类型
data [] a = [] | a : [a]

但我无法使用相同的结构创建自己的类型:

data %% a = %% | a : %a%
  

错误:输入'%%'

时解析错误

2 个答案:

答案 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只接受一个参数)。

列表语法[]由编译器专门处理,类似于元组的(,),(,,),...。只有:遵循一般规则(可能偶然)。