我似乎正在与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
实现时,它编译得很好。
答案 0 :(得分:2)
您需要在括号中包含S n
个模式。执行此操作后,您将收到编译器错误,因为Nat
中已经定义了Prelude
。因此,要编译代码,只需将Nat
替换为Natural
(或其他任何内容)。虽然Z
和S
构造函数也在Prelude
中定义,因此您需要重命名所有内容才能在REPL中轻松测试或使用%hide
directive。
但至少这段代码编译:
module Test
data Natural = Z | S Natural
Eq Natural where
Z == Z = True
(S n1) == (S n2) = n1 == n2
_ == _ = False