Я бы хотел перечислить пару монад, еще не упомянутых в других ответах.
Перечисление и взвешенные поисковые монады
Монаду Omega
можно использовать для продуктивного обхода бесконечных списков результатов. Сравните:
>>> take 10 $ liftM2 (,) [0..] [0..]
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9)]
>>> take 10 $ runOmega $ liftM2 (,) (each' [0..]) (each' [0..])
[(0,0),(0,1),(1,0),(0,2),(1,1),(2,0),(0,3),(1,2),(2,1),(3,0)]
С немного более продвинутым WeightedSearch
монадой также можно назначить веса для вычислений, чтобы результаты вычислений с меньшими весами были первыми в выводе.
Монада накопления ошибок
Полезный These
тип данных образует Monad
, аналогичный Either
, но способный скорее накапливать ошибки. Пакет также определяет MonadChronicle
класс , а также ChronicleT
монадный трансформатор на основе These
.