首先,这建立在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
吗?