【问题标题】:Haskell List Comp Type Error from Minus in defining rangeHaskell List Comp Type Error from Minus in definition range
【发布时间】:2019-07-24 14:28:43
【问题描述】:

通过较早的考试,我复制了这段代码并试图让它工作。

rems :: Integer -> [(Integer ,Integer )]
rems n = [(i, n `mod` i) | i <- [2 ..(n−1)]]

现在无论有没有类型声明,我都会收到错误:

Variable not in scope: (−) :: Integer -> Integer -> Integer
ghc version 8.6.3

我能够通过在 where 子句中计算 n-1 来修复它,但我不明白为什么这是一个修复。我当然知道 Haskell 中的 Integer 是什么。

rems n = [(i, n `mod` i) | i <- [2 ..j] ]
        where j =  n-1

有人可以向我解释一下为什么这种看似没有效果的更改确实可以解决错误,还有其他方法吗?

【问题讨论】:

  • 这很奇怪,因为当我复制粘贴您的定义时,我得到了类似的错误(但使用? 而不是-),但自己输入 - 逐个字符重复,看来 - 它工作正常。我只能假设你也在复制粘贴并且那里有某种看不见的控制字符?
  • 刚刚尝试了一个在线差异检查器,它突出了最后一部分的差异:..(n−1)]]。不过还是看不出来是什么。无论哪种方式,这似乎都不是真正的 Haskell 问题。
  • 找到了,看来你的-实际上是这样的:fileformat.info/info/unicode/char/2212/index.htm - unicode U+2212,而不是标准的减号U+002D

标签: haskell integer typeerror


【解决方案1】:

这是一个简单的印刷错误。您的 不是连字符(Haskell 期望的) - 它是一个 Unicode 减号字符,这是不同的。您的来源必须自动将前者转换为后者。只需将其替换为连字符(使用键盘输入)即可。

【讨论】:

  • 但是……也许那应该被解释为一个减号。我认为那将是一个很好的 GHC 提案。
  • @dfeuer 你仍然可以使用(−) = (-)(前者是减号,后者是连字符)。它至少在 GHCi 中有效。但好处是有争议的,在等宽字体中。
  • 问题是在声明Num 实例时是否可以使用减号,这需要修改UnicodeSyntax 语言扩展。等宽字体并没有真正的好处,但是如果您以某些方式格式化代码,则比例字体对于 Haskell 来说效果很好。
  • @dfeuer 是的,这更有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2013-04-27
  • 2023-01-17
  • 2013-06-14
  • 2018-02-08
  • 1970-01-01
相关资源
最近更新 更多