【问题标题】:Implementing an interface for a plain old recursive data type为普通的旧递归数据类型实现接口
【发布时间】:2017-08-11 10:50:11
【问题描述】:

我似乎在与 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 实现时,它编译得很好。

【问题讨论】:

    标签: interface idris recursive-datastructures


    【解决方案1】:

    您需要将S n 模式括在括号中。完成此操作后,您将收到编译器错误,因为Nat 已在Prelude 中定义。因此,要编译您的代码,只需将 Nat 替换为 Natural(或其他任何内容)即可。不过,ZS 构造函数也在 Prelude 中定义,因此您要么需要重命名所有内容才能在 REPL 中轻松测试,要么使用 %hide directive

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

    module Test
    
    data Natural = Z | S Natural
    
    Eq Natural where
      Z == Z = True
      (S n1) == (S n2) = n1 == n2
      _ == _ = False
    

    【讨论】:

    • 啊,当然,我会在 Haskell 中做同样的事情。似乎伊德里斯在编译器错误方面还有很长的路要走:)
    • @SebastianGraf 是的,Idris 错误消息不是很好。我猜还有 Idris 解析器。但情况正在好转。我希望这种语言的社区能够变得足够大,并且生态系统将得到显着改善:)
    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    相关资源
    最近更新 更多