Я не думаю, что для этого есть какие-либо библиотеки; В конце концов, conv
- невероятно простая функция, а наоборот - просто runListT
.
conv
аналогично liftMaybe
, который часто требуется при использовании MaybeT
:
liftMaybe :: (Monad m) => Maybe a -> MaybeT m a
liftMaybe = MaybeT . return
Я бы порекомендовал назвать это что-то вроде liftList
. 1
Что касается лучшего монадного преобразователя для недетерминизма, я рекомендую взглянуть на пакет logict , основанный на преобразователе LogicT
Олега, который является монадой логики обратного отслеживания с продолжением с некоторые полезные операции . В качестве бонуса, поскольку []
является экземпляром MonadLogic
, эти операции также работают со списками.
1 Интересно, что мы можем определить функцию, которая обобщает шаблон conv
и liftMaybe
:
import Data.Foldable (Foldable)
import qualified Data.Foldable as F
choose :: (Foldable t, MonadPlus m) => t a -> m a
choose = F.foldr (\a b -> return a `mplus` b) mzero
Это, вероятно, сделает ваш код довольно запутанным, поэтому я не рекомендую его использовать:)