使用 Megaparsec 解析数组 [1][2] 时出现问题

问题描述

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

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

这里出了什么问题?

解决方法

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,产生 ArrayIndex (Var "array") 2,然后应用 f,产生 ArrayIndex (ArrayIndex (Var "array") 2) 1

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