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

Interface 为普通的旧递归数据类型实现接口,interface,idris,recursive-datastructures,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): 我不明白为什么,我基本上使用了与文档相同的语法 当我为自定义的非递归类型(如Bool)编写Eq实现时,它编译得很好。您需要将sn模式括在括号中。这样做之后,您将得到编译器错误,因为Nat已在Prelude中定义。因此

我似乎在和Idris语法作斗争

module Test

data Nat = Z | S Nat

Eq Nat where
  Z == Z = True
  S n1 == S n2 = n1 == n2
  _ == _ = False
这会导致以下错误(v1.1.1):

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


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

您需要将
sn
模式括在括号中。这样做之后,您将得到编译器错误,因为
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似乎还有很长的路要走:)@SebastianGraf是的,Idris的错误消息不是很好。。我想还有Idris解析器。但情况正在改善。我希望这种语言的社区足够大,生态系统将得到显著改善:)
module Test

data Natural = Z | S Natural

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