为普通的旧递归数据类型

时间:2017-08-11 10:50:12

标签: interface idris recursive-datastructures

我似乎正在与Idris语法作斗争。

module Test

data Nat = Z | S Nat

Eq Nat where
  Z == Z = True
  S n1 == S n2 = n1 == n2
  _ == _ = False

这引发了以下错误(v1.1.1):

.\.\Test.idr:5:8: error: expected: "@",
    "with", argument expression,
    constraint argument,
    function right hand side,
    implicit function argument,
    with pattern
Eq Nat where
       ^
Type checking .\.\Test.idr

我不明白为什么,我基本上使用了与文档相同的语法。

当我为自定义的非递归类型(例如Eq)编写Bool实现时,它编译得很好。

1 个答案:

答案 0 :(得分:2)

您需要在括号中包含S n个模式。执行此操作后,您将收到编译器错误,因为Nat中已经定义了Prelude。因此,要编译代码,只需将Nat替换为Natural(或其他任何内容)。虽然ZS构造函数也在Prelude中定义,因此您需要重命名所有内容才能在REPL中轻松测试或使用%hide directive

但至少这段代码编译:

module Test

data Natural = Z | S Natural

Eq Natural where
  Z == Z = True
  (S n1) == (S n2) = n1 == n2
  _ == _ = False