3

首先,这建立在https://www.schoolofhaskell.com/user/bartosz/understanding-algebras 因此如果不熟悉代数和递归方案,请阅读上下文。

假设我有一个简单的表达式解析器:

data Expr a = ... -- whatever
parse :: String -> Fix Expr
eval :: Algebra Expr (Either String Int)

它可能会成功,也可能不会成功。例子:

cata eval $ parse "3+4" -- Right 7
cata eval $ parse "3+x" -- Left "x not defined"

我的问题是,如果有人

1) 更新parse函数以使用解析位置注释节点

2) 用解析位置前缀错误消息

我如何将下面的这些新功能与上面的功能集成在一起?

type ParsePositions = (Int,Int)
parse' :: String -> Cofree Expr ParsePositions
prefixError :: ParsePositions -> String -> String

示例用法:

run "3+4" -- Right 7
run "3+x" -- Left "Error parsing [2,2]: x not defined"

这会是一个zygomorphism吗?也许是组织同态?两者都需要某种类型的扭曲。

加分点:我应该使用 elgot 代数在失败时短路,看到评估可以返回Left String吗?

4

0 回答 0