Создание уникальных меток в Haskell

Я пишу компилятор для простого императивного языка в Haskell, выводящий байт-код Java.Я дошел до того, что испускаю абстрактное представление байт-кодов.

При написании кода для компиляции операторов if я столкнулся с некоторыми проблемами. Для реализации if-операторов мне нужны ярлыки, на которые можно перейти. Поэтому мне нужно сгенерировать имя для этой метки, и это имя должно быть уникальным.

Моя первая мысль заключалась в том, чтобы передать некоторое состояние через compileStatement , т.е.

compileStatement :: Statement -> UniqueIDState -> [AbstractInstruction]

Конечно, compilerStatement рекурсивно, поэтому использование этого метода потребует от меня передачи состояния генератор уникальных идентификаторов обратно вверх из рекурсивных вызовов:

compileStatement :: Statement -> UniqueIDState -> (UniqueIdState, [AbstractInstruction])

Это кажется немного неуклюжим, особенно если я понимаю, что мне нужно переносить больше состояний в будущем; есть ли более элегантный способ?

6
задан Viktor Dahl 10 June 2011 в 20:03
поделиться