首先,这建立在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"
这会是一个对称吗?也许是组织形态?两者都需要某种类型的扭曲。
奖励积分:如果评估可以返回Left String
,我是否应该使用elgot代数短路?