Я пытаюсь создать трансформатор монады для будущего проекта, но, к сожалению, моя реализация Monad typeclasse (>> =) не работает.Ошибка типа при попытке реализовать функцию (>> =) для создания настраиваемого монадного трансформатора
Прежде всего, здесь является реализация Базового монады:
newtype Runtime a = R {
unR :: State EInfo a
} deriving (Monad)
Здесь реализация typeclasse Монада осуществляется автоматически GHC (с использованием GeneralizedNewtypeDeriving
языка прагму). Монада трансформатора определяется как так:
newtype RuntimeT m a = RuntimeT {
runRuntimeT :: m (Runtime a)
}
Проблема возникает от того, как я функции создания экземпляра (>> =) в typeclasse Монады:
instance (Monad m) => Monad (RuntimeT m) where
return a = RuntimeT $ (return . return) a
x >>= f = runRuntimeT x >>= id >>= f
так, как я это вижу, первая >>=
работает в лежащей в основе m
монада. Таким образом, runRuntimeT x >>=
возвращает значение типа Runtime a
(справа?). Затем, следующий код, id >>=
, должен вернуть значение типа a
. Это значение передается функции f типа f :: (Monad m) => a -> RuntimeT m b
.
И вот возникает проблема типа: тип функции f
не соответствует типу, требуемому функцией (>> =). Джоу я могу сделать это последовательным? Я понимаю, почему это не работает, но я не могу превратить его в нечто функциональное.
Edit: Сообщение об ошибке:
Core.hs:34:4:
Occurs check: cannot construct the infinite type: m = RuntimeT m
When generalising the type(s) for `>>='
In the instance declaration for `Monad (RuntimeT m)'
Failed, modules loaded: none.
Спасибо вам помочь, и не стесняйтесь, чтобы исправить любые недостатки в моем сообщении,
Чарли П.
Пожалуйста, покажите нам сообщение об ошибке, которое вы получаете. – dave4420