Hugs 似乎有问题,!!
在一个部分应用程序中不包含几个。
虽然这在 GHCi 中运行良好:
([[0]]!!0!!)0
Hugs 报告)
.
这是拥抱中的错误吗?
为第二个列表索引运算符添加一个额外的大括号虽然有效:
(([[0]]!!)0!!)0
或者
(([[0]]!!0)!!)0
这是 Hugs 中的一个已知问题。来自关于表达的拥抱 98 用户指南部分:
在 Hugs 中,表达式必须是
fexp
(orcase
ordo
)。(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+)
.