3

我正在关注Megaparsec 文档来解析多维数组。

opSubscript = Postfix $ foldr1 (.) <$> some singleIndex

singleIndex = do
  index < brackets expr
  return $ \l -> ArrayIndex l index

array[1][2]预计会被解析为

ArrayIndex (ArrayIndex (Var "array") 1)) 2

然而,它是

ArrayIndex (ArrayIndex (Var "array") 2)) 1

这里出了什么问题?

4

1 回答 1

1

some singleIndex已经解析了一个包含两个函数的列表[f, g],其中

f = \l -> ArrayIndex l 1
g = \l -> ArrayIndex l 2

然后用foldr1. 而且因为

foldr1 f [x, y] = x `f` y

你得到的函数是f . g. 自然,这g首先适用, yielding ArrayIndex (Var "array") 2,然后再适用f, yielding ArrayIndex (ArrayIndex (Var "array") 2) 1

所以你的解析很好,但你的结果是错误的。您想要不同的关联性,或顺序或其他东西。

于 2021-02-08T22:53:52.593 回答