Я реализую монадный преобразователь MaybeT
.
newtype MaybeT m a =
MaybeT { runMaybeT :: m (Maybe a) }
Затем я пишу монаду для возврата.
newtype BackT m a =
BackT { unBackT :: MaybeT m (a, BackT m a) }
Здесь Back m a
имеет определение рекурсии.
На мой взгляд, существуют изоморфизмы.
unBackT
BackT m a <-------------------> MaybeT m (a, BackT m a)
BackT(constructor)
runMaybeT
MaybeT m (a, BackT m a) <------------------> m (Maybe (a, BackT m a))
MaybeT(constructor)
Таким образом, я на самом деле получаю что-то вроде
m (Just(1, m (Just(2, m (Just(3, m (Just(4, Nothing))))))))
В приведенном выше примере есть 4 вычисления(Монада это вычисление?).Мне нужно что-то под названием runBackT
, чтобы собрать их, используя []
.
Спасибо за ответ от @rampion, и я удалил некоторые бессмысленные вопросы.
Какой тип результатов?Это должно быть что-то в зависимости от m
. (Ответ: тип результатов должен быть m a
.) Как собрать все результаты?Возможно ли это? (Ответ: Монада m a
не гарантирует наличия способа получить «развернутый» тип.) - Как собрать все аргументы, такие как 1, 2, 3, 4 впример.Это тип должен быть
[a]
.Существует ли такая BackT m a -> [a]
функция?Или мы можем получить только m [a]
?(Ответ: может существовать только BackT m a -> m [a]
.)
Обновление
Монаду можно разделить на два класса:«открытые монады» (например, []
, Maybe
) и «закрытые монады» (например, IO
).«Открытые монады» имеют функции типа m a -> b
для их открытия.например,
showMaybe :: (Show a) => Maybe a -> String
showMaybe mx = case mx of
Nothing -> "Nothing"
Just x -> show x
- Как реализовать
(Monad m, Show m) => BackT m a -> [String]
? - В общем,
Monad m => (m a -> b) -> BackT m a -> [b]
? - При каких условиях существует
Monad m => BackT m a -> [m a]
?BackT m a
последовательности вычислений m a
рекурсивно по кросс-рекурсивному определению.Как превратить его в итерацию [m a]
?Если он существует, как его реализовать?Мы можем сопоставить m a -> b
с [m a]
, и вопрос (2) будет решен. Monad m => (m a -> a) -> BackT m a -> m [a]
?Просто оберните результат вопроса (2) конструктором m
.
Поэтому ключевым моментом является вопрос (3).
Самым сложным для меня является определение рекурсии BackT m a
.Буду признателен, если вы покажете орудие или поделитесь советом.
Ответы только на вопрос (3) в порядке.
Обновление
Спасибо за комментарии @rampion, ListT
из списка list-t ответил на мои вопросы.