Как смешать 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?

0 ответов

Другие вопросы по тегам