为普通的旧递归数据类型实现接口

Implementing an interface for a plain old recursive data type

我似乎在与 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

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

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

您需要将 S n 模式括在括号中。这样做之后,你会得到编译器错误,因为 Nat 已经在 Prelude 中定义了。因此,要编译您的代码,只需将 Nat 替换为 Natural(或其他任何内容)。但是,ZS 构造函数也在 Prelude 中定义,因此您要么需要重命名所有内容以便能够轻松地在 REPL 中进行测试,要么使用 .

但至少这段代码可以编译:

module Test

data Natural = Z | S Natural

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