まず、これは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
ますか?