为普通的旧递归数据类型实现接口
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
(或其他任何内容)。但是,Z
和 S
构造函数也在 Prelude
中定义,因此您要么需要重命名所有内容以便能够轻松地在 REPL 中进行测试,要么使用 .
但至少这段代码可以编译:
module Test
data Natural = Z | S Natural
Eq Natural where
Z == Z = True
(S n1) == (S n2) = n1 == n2
_ == _ = False
我似乎在与 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
(或其他任何内容)。但是,Z
和 S
构造函数也在 Prelude
中定义,因此您要么需要重命名所有内容以便能够轻松地在 REPL 中进行测试,要么使用
但至少这段代码可以编译:
module Test
data Natural = Z | S Natural
Eq Natural where
Z == Z = True
(S n1) == (S n2) = n1 == n2
_ == _ = False