Как чисто преобразовать между списками и преобразователями монад ListT?

В настоящее время я пишу проект, в котором я интенсивно использую преобразователь монад ListT . При использовании простых списков реализовать недетерминизм очень просто. Однако как только мне пришлось преобразовать свой код в ListT , все стало намного сложнее 1 .

В качестве простого примера: преобразование из [a] в ListT a на самом деле требует объединения двух функций:

conv :: (Monad m) => [a] -> ListT m a
conv = ListT . return

Хотя это просто, я удивлен, что этого еще нет.

Вопросы:

  • Есть ли лучший способ справиться с недетерминизмом там, где нужен преобразователь монад?
  • Существуют ли какие-либо методы / библиотеки для чистого преобразования между списками и ListT ?

1 Точные причины довольно сложны, поэтому я не хочу вдаваться в подробности много об этом.

6
задан julkiewicz 9 February 2012 в 16:49
поделиться