В настоящее время я пишу компилятор в Haskell как игрушка проект и у меня есть функция, которая выполняет динамическую трансформацию с подписью:Transform функции без гражданства, чтобы Stateful один
transform :: (Exp -> m Exp) -> Exp -> m Exp
Это позволяет мне реализовать следующие типы операций над ним:
- Результаты накопления, например получить список функций, вызываемых внутри выражения.
- Преобразования, которые могут возвращать ошибки, например. который либо возвращает AST с типами, либо с ошибкой, описывающей проблемы типа.
- преобразования, которые зависят от ранее сделанных преобразований, например. дедупликация имен переменных при генерации тестового ввода.
- Я надеюсь, что это также позволит мне делать вычисления без учета состояния без изъятия.
Но почему-то, несмотря на то, что это должно быть очень легко, я застрял на создание лица без функции карты, основываясь на вышеупомянутом преобразования метода, который имеет следующую подпись:
map :: (Exp -> Exp) -> Exp -> Exp
Я предпочел бы не имеют одинаковую логику о том, как снова пересекать детей на карте, но на самом деле реализовать ее поверх преобразования.
Что такое 'm' в вашем методе' transform'? Это произвольная монада? Не могли бы вы использовать монаду «Идентичность»? –
Если вы действительно имеете в виду 'transform :: Monad m => (Exp -> m Exp) -> Exp -> m Exp', то вы можете создать экземпляр' m' с 'Identity' и получить свою« карту ». – user2407038
Да, m - произвольная монада, поэтому я могу выбрать ее для реализации функции отображения. Но как именно я это сделал? Извините, это, вероятно, очень очевидно, но я как-то смущен, потому что я, вероятно, слишком долго думал об этом. – Lykos