使用双符号创建文字



列表类型是用

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上面只接受一个参数(。

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

最新更新