Haskell 使用带有递归数据的Parsec作为流

Haskell 使用带有递归数据的Parsec作为流,haskell,interpreter,parsec,Haskell,Interpreter,Parsec,我正在用mixfix操作符为函数式编程语言编写一个解释器,就像 这意味着我必须运行一个解析器(我使用Alex/Happy)来获得一个AST,这个特定部分(比实际的Expr小): 使用这个Expr,我必须运行第二个解析器(我打算使用Parsec)来执行以下处理: λ let example = Apply [Id "if", Id "a", Id "/\\", Id "b", Id "then", Id "c", Id "else", Id "d"] λ parseMixfix example R

我正在用mixfix操作符为函数式编程语言编写一个解释器,就像

这意味着我必须运行一个解析器(我使用Alex/Happy)来获得一个AST,这个特定部分(比实际的
Expr
小):

使用这个
Expr
,我必须运行第二个解析器(我打算使用Parsec)来执行以下处理:

λ let example = Apply [Id "if", Id "a", Id "/\\", Id "b", Id "then", Id "c", Id "else", Id "d"]
λ parseMixfix example
Right (Apply [Id "if_then_else_",Apply [Id "_/\\_",Id "a",Id "b"],Id "c",Id "d"])
我从一个解析器开始,它接收一个
[Expr]
流,但它只接受
应用中的列表,不深入树中,只在顶层进行解析

因此,我正在考虑选择使用
[Expr]
作为
,而不是使用
Expr
,必须为其执行
实例;这就是我所处的位置:

data Tok a = This a | Over (Tok a) deriving (Show)

instance (Monad m) => Stream Expr m (Tok Expr) where
        uncons ex = check ex
            where
                check :: Monad m => Expr -> m (Maybe (Tok Expr, Expr))
                check ex = case ex of
                        Id s         -> return $ Just (This (Id s), Apply [])
                        Apply (x:xs) -> do
                                mst <- check x
                                return $ fmap (\(a, b) -> (Over a, b)) mst
data Tok a=该a |超过(Tok a)推导(显示)
实例(Monad m)=>Stream Expr m(Tok Expr),其中
无约束ex=检查ex
哪里
检查::Monad m=>Expr->m(可能是(Tok Expr,Expr))
检查ex=案例ex
Id s->返回$Just(此Id s,应用[])
应用(x:xs)->do
mst(在a,b上)mst
它使用
datatok
作为拉链面包屑(或者至少我是这样认为的),来表示它在树中的深度


我知道这不是正确的代码,但你们应该明白。我想知道我是否走上了正确的道路,或者是否有更好的解决方案。我也错过了这里所有的
案例;这是因为我以前使用
Id | Apply
only tree进行测试。

有一篇论文,其中还提到了一堆其他相关论文。不过,它已经过时了,因为正如Agda现在经常说的那样,“运营商的待遇已经改变了”。这就是我一直用来推动这项工作的文件。如果它过时了,我在哪里可以找到关于他们现在如何对待运营商的信息?我不知道有什么改变以及如何改变的任何描述。我知道的唯一一件事是Agda现在支持节(例如,您可以为
λbm->if b then 1 else>编写
if\u then 1 else\u
)。尝试询问Agda邮件列表。更改(w.r.t.处理Agda中的操作员)如中所述。
λ let example = Apply [Id "if", Id "a", Id "/\\", Id "b", Id "then", Id "c", Id "else", Id "d"]
λ parseMixfix example
Right (Apply [Id "if_then_else_",Apply [Id "_/\\_",Id "a",Id "b"],Id "c",Id "d"])
data Tok a = This a | Over (Tok a) deriving (Show)

instance (Monad m) => Stream Expr m (Tok Expr) where
        uncons ex = check ex
            where
                check :: Monad m => Expr -> m (Maybe (Tok Expr, Expr))
                check ex = case ex of
                        Id s         -> return $ Just (This (Id s), Apply [])
                        Apply (x:xs) -> do
                                mst <- check x
                                return $ fmap (\(a, b) -> (Over a, b)) mst