我正在尝试学习箭头,以及PArrows如何取代Parsec,但是教程数量几乎不存在。我相信我们可以从简单的例子中受益匪浅,因此,给定二叉树:
data Tree = Node Tree Tree | A | B deriving Show
如何使用PArrow来解析类似于:
的字符串"((A B) (A (B A)))"
这样就变成了:
Node (Node A B) (Node A (Node B A))
答案 0 :(得分:1)
这可能不是最干净的答案,但我设法做到了:
import Text.ParserCombinators.PArrow
import Control.Arrow
data Tree = Node Tree Tree | A | B deriving Show
text = "((B A) (A B))"
fromToken :: Char -> Tree
fromToken 'A' = A
fromToken 'B' = B
token = anyOf "AB" >>> arr fromToken
node = arr (uncurry Node)
<<< ((char '(' >>> token <+> node) -- left side
>>! white -- whitespace
&&& ((token <+> node) >>! char ')')) -- right side
main = print $ runParser node text
介意我还在努力学习我的箭头。