Мне нужна монада, которая будет сообщать об ошибках типов данных (не строк) в ходе вычислений.Я исследовал несколько различных реализаций:
- A
State [Error] a
монада, где ошибки добавляются с cons (:
), и в самом конце я вызываю reverse
в списке ошибок, чтобы получитьфактический заказ. - A
Writer (Endo [Error]) a
монада, где я могу добавить ошибки с Endo (e :)
.Однако меня беспокоит все бесполезное объединение функций идентификации.Если я никогда не добавлю никаких ошибок, тогда моя Endo
все равно будет большой структурой данных, состоящей из множества составных id . id
композиций. - A
Reader (MVector s Error) (ST s a)
монада, в которой я увеличиваю вектор ошибок при добавлении новой ошибки.В векторном пакете нет предопределенной функции «push», поэтому я должен написать свою собственную.Кроме того, мне потребуется добавить монаду ST
в некоторые из моих вычислений.
В императивном языке я бы использовал вектор и вызвал бы метод "push" или эквивалентный ему метод, которыйдайте мне амортизированные O (1) добавления, и результирующий список будет в правильном порядке.
Какова наиболее эффективная реализация монады Haskell (относительно эффективности императивного языка) для этой задачи?
Часть моего кода в монаде ST
, а часть моего кода чистая.Я могу использовать разные монады для этих разных случаев использования.Должен ли я использовать что-то другое для моего ST
кода, чем для моего чистого кода?