Одна из ошибок, которую я сделал - это неправильное AST. Подумал, что круто будет воспользоваться Data.Tree и поэтому ошибся в создании типа (HLElement). Сначала правильный AST, потом можно его преобразовать в Data.Tree, если очень хочется. Еще я объединил глобальные и локальные объявления в одном типе (Объявление глобальной переменной и локальной), так нельзя, создайте 2 типа.