Interface 为普通的旧递归数据类型实现接口
我似乎在和Idris语法作斗争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中定义。因此
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