Каков тип очень простой функции развертки для преобразованной монады?

Я тренируюсь с монадными трансформаторами, как представлено в 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!

Другие вопросы по тегам