Я совершенно новый для Haskell и функционального программирования в целом, поэтому извините меня, если вопрос кажется простым или глупым.Элементы маркировки Haskell в рекурсивной функции
У меня есть парсер для простого языка, который создает абстрактное синтаксическое дерево. Чтобы сгладить AST (поверните while и if statements в прыжки), мне нужно поместить метки в дерево. Проблема в том, что я не знаю, каким должен быть следующий ярлык (я все еще думаю императивно, потому что, если бы у меня было состояние, ничто из этого не было бы проблемой).
Функция, которую я до сих пор является следующее:
transform :: Stmt -> FStmt
transform (Seq stmt) = FSeq (map transform stmt)
transform (Assign var val) = FAssign var val
transform (While cond stmt) = FWhile "label1" (Jumpf cond "label2") (transform stmt) (Jump "label1") "label2"
transform (If cond stmt1 stmt2) = FIf (Jumpf cond "label") (transform stmt1) "label" (transform stmt2)
В своем нынешнем состоянии, функция «сглаживает» АСТ, но не пытается ставить правильные метки (он использует ту же строку для каждой конструкции).
В основном проблема заключается в том, что в случае последовательного оператора (и каждая программа является последовательным утверждением) я не могу придумать способ передать следующее значение, которое должно использоваться в метках.
Заранее спасибо.
Но не будет (map (transform 'freeIdx) stmt) отправить такую же «nextLabel» всем Stmt в Списке? Это могло бы привести к тому, что несколько плоских if или while с одним и тем же ярлыком? Я не пробовал государственную монаду главным образом потому, что я не понимал ее и не мог заставить ее работать. Я очень благодарен за ваше решение и обязательно попробую, но я все равно хотел бы узнать, можно ли решить проблему без монадов. – Elldorin
Вы правы. Первое решение не является полным. Я постараюсь это исправить. – freestyle
Итак, я исправил первую версию. – freestyle