如何使用PArrows解析树状结构?

时间:2015-06-19 03:15:46

标签: haskell arrows

我正在尝试学习箭头,以及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))

1 个答案:

答案 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

介意我还在努力学习我的箭头。