haskell - объясните, где в коде ошибка

yroslavasako


data ActionMonadT m a = ActionMonadC{mainMonad :: m a}

instance (Monad c) => Monad (ActionMonadT c)
where
x >>= k = ActionMonadC{
mainMonad = {(mainMonad x) >>= (k.mainMonad)}
return a = ActionMonadC{
mainMonad = return a}

пытался составить монаду - не получилось из-за ошибки, стал её упрощать - упростил до идентити, а ошибка осталась. Что хотел: чтобы монада хранила внутри себя монаду и применяла её при обработке всех процедур.
Что получилось: ошибка

Occurs check: cannot construct the infinite type:
c = ActionMonadT c
When generalising the type(s) for `>>='
In the instance declaration for `Monad (ActionMonadT c)'

Что хочу от форума - чтобы объяснили, где косяк в синтаксисе.

alfadred

У тебя вот тут:
mainMonad = {(mainMonad x) >>= (k.mainMonad)}
что-то непонятное с фигурной скобкой.
data ActionMonadT m a = ActionMonadC{mainMonad :: m a}

instance (Monad c) => Monad (ActionMonadT c) where
x >>= k = ActionMonadC{
mainMonad = mainMonad x) >>= (mainMonad . k
}
return a = ActionMonadC{
mainMonad = return a
}

У меня компилится.

yroslavasako

всё ясно, оператор (.) неправильно я понял
Оставить комментарий
Имя или ник:
Комментарий: