Я не очень хороший программатор haskell. Мне поручено написать компилятор в моем университете, и я выбрал haskell, так как это хороший инструмент для этой цели. Я использую монады StateT и за исключением, так что я типа:Haskell StateT и ExceptT chain
type Runner r s = StateT s (ExceptT LatteError IO) r
type RT r s = IO (Either LatteError (r, s))
Я использую его создать ходить дерево программы и производить код ассемблера, и она работает, как я хочу. В основной функции для подходя дерева я использую
rProgram :: Program -> Runner [String] CompileState
и распаковывать результат я использую функцию
runR program = runExceptT (runStateT (rProgram program) initialCompileState)
То, что я хочу сделать, не иметь некоторые валидатор, как проверка типа, идент проверка существования, и я знаю, чтобы написать их. Позволяет сказать, у меня есть
tcProgram :: Program -> Runner() TypeCheckState
ieProgram :: Program -> Runner() IdentExistanceState
Я хочу, чтобы запустить их обоих в элегантно, и отказ обозначается throwError. Как ставить многие функции, подобные им вместе?
«Я не очень хороший программник haskell». Готовность сделать это признание уже говорит мне, что вы, вероятно, довольно хороший программист. – Alec