Эффективная реализация монады журнала ошибок - PullRequest
0 голосов
/ 22 января 2019

Мне нужна монада, которая будет сообщать об ошибках типов данных (не строк) в ходе вычислений.Я исследовал несколько различных реализаций:

  • 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 кода, чем для моего чистого кода?

1 Ответ

0 голосов
/ 23 января 2019

Вы должны основать свою монаду логирования на StateT Seq.Однако, используя StateT, у вас будет монадный преобразователь, который может наложить вашу функциональность регистрации на любую другую монаду.

Часть моего кода находится в монаде ST, а часть моего кода чистая.Я могу использовать разные монады для этих разных случаевДолжен ли я использовать что-то другое для моего ST кода, чем для моего чистого кода?

Для материала в монаде ST вы можете использовать монадный преобразователь, как описано выше.Для чистого кода все сложнее: вам придется переписать чистый код как монадический или, по крайней мере, аппликативный .На данный момент это уже не чисто, потому что регистрация - побочный эффект.Трудно советовать дальше, потому что я не знаю, чего вы пытаетесь достичь;возможно, имеет смысл возвращать данные регистрации из чистого кода внутри типа результата.

...