Как смешать CoFree в катаморфизме F-алгебры?
Во-первых, он основан на 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
?