Каков тип очень простой функции развертки для преобразованной монады?
Я тренируюсь с монадными трансформаторами, как представлено в http://www.cs.nott.ac.uk/~nhn/MGS2006/LectureNotes/lecture03-9up.pdf
У меня есть реализация для преобразователя ошибок, который читает как:
newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)
(На самом деле это выглядит как MaybeT
, но хорошо...)
Я хочу указать функцию, чтобы развернуть ET
"S. Эта функция приведена в документе и выполняет свою работу даже без объявления типа:
unET (ET m) = m
Дело в том, что я не в состоянии указать его тип экспликации. Если я добавлю тип, который мне кажется разумным:
unET :: (Monad m) => ET m a -> m a
сообщение об ошибке Could not deduce (a ~ Maybe a) from the context (Monad m)
Какой тип unET
функционировать?
Я уже пробовал магические заклинания компилятора NoMonomorphismRestriction
, MonoLocalBinds
, который я нашел в ответах на подобные вопросы. Все еще нет радости.
Спасибо за Ваше внимание.
1 ответ
Просто посмотрите на определение:
unET (ET m) = m
Вы знаете, что единственное поле ET
имеет тип: m (Maybe a)
, unET
функция занимает ET m a
и возвращает свое единственное поле, поэтому тип возвращаемого значения unET
должен быть тип поля, т.е. m (Maybe a)
и не m a
!