【问题标题】:Why does Hugs complain about `|` in my data type declaration?为什么 Hugs 在我的数据类型声明中抱怨 `|`?
【发布时间】:2010-03-17 23:05:40
【问题描述】:

我正在用haskell 编写一个小型的lisp 解释器。在这个过程中,我定义了这个数据类型,以获得一个更少类型的数字。

data Number = _Int Integer
            | _Rational Rational
            | _Float Double
    deriving(Eq,Show)

用 hugs 编译失败并出现以下错误:

ERROR "types.hs":16 - 数据类型声明中的语法错误(意外的 `|')

第 16 行是上面代码中第一个 | 所在的行。

【问题讨论】:

  • 你用的是什么编译器? GHCi (v 6.10.4) 抱怨下划线,但是当我 s/_/M/ 时,它编译得很好。
  • 我正在使用 hugs98 200609-4。这确实是导致问题的下划线。 :)
  • 顺便说一句,在几乎任何情况下,我都会推荐 GHC 而不是 Hugs。许多较早的文档说,Hugs 更适合初学者,因为它具有 REPL,但事实并非如此,因为 GHCi 实际上提供了比 Hugs 更好的 REPL。

标签: haskell hugs


【解决方案1】:

Hugs 在这里有点迂回。实际的问题不是|,而是构造函数名称开头的下划线——它们不允许以下划线开头。这不仅仅是构造函数以大写字母开头的约定,而是 Haskell 语法的一部分。

对于 Hugs 的“想法”,我最好的猜测是,由于您的第一个构造函数没有正确命名,因此当您之后提供替代构造函数时,Hugs 说:“等等,我还没有看到有效的构造函数! 这是怎么回事?”

GHC 给出了更清晰的错误:

types.hs:1:14: Not a constructor: `_Int'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    相关资源
    最近更新 更多