6

Hugs 似乎有问题,!!在一个部分应用程序中不包含几个。

虽然这在 GHCi 中运行良好:

([[0]]!!0!!)0

Hugs 报告).

这是拥抱中的错误吗?

为第二个列表索引运算符添加一个额外的大括号虽然有效:

(([[0]]!!)0!!)0

或者

(([[0]]!!0)!!)0
4

1 回答 1

2

这是 Hugs 中的一个已知问题。来自关于表达的拥抱 98 用户指南部分:

在 Hugs 中,表达式必须是fexp(or caseor do)。(a+b+)像和这样的合法表达(a*b+)被拒绝。

离题警报

也许这就是FUZxxl他在评论中所说的?

尝试定义自己的(!!)函数ghc并将其设置为具有右关联固定性:

import Prelude hiding ((!!))
infixr 5 !! -- infixr will make it right associative
(!!) a b = head . drop b $ a

现在那条线也行不通了ghci

ghci> :t ([[0]] !! 0 !!)

<interactive>:1:1:
    The operator `!!' [infixr 5] of a section
        must have lower precedence than that of the operand,
          namely `!!' [infixr 5]
        in the section: `[[0]] !! 0 !!'

因为(!!)已经设置infixr并且现在是右结合的。如果你使用infixl,那条线可以正常工作。

这是与您提出的问题完全不同的问题。这是关于左与右关联性的,而 Hugs 的问题在于它只是不解析像(a+b+).

于 2012-03-29T20:38:01.367 回答