我正在使用http://www.cs.nott.ac.uk/~nhn/MGS2006/LectureNotes/lecture03-9up.pdf
中提到的monad变形金刚进行锻炼我有错误转换器的实现,其内容如下:
newtype ET m a = ET (m (Maybe a))
deriving instance Show (m (Maybe a)) => Show (ET m a)
(实际上这对我来说就像MaybeT
,但好吧......)
我希望指定一个解包ET
的函数。该功能在论文中给出,即使没有类型声明也能完成它的工作:
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
,我在类似问题的答案中找到了它。仍然没有快乐。
感谢您的关注。
答案 0 :(得分:4)
看看定义:
unET (ET m) = m
您知道ET
的唯一字段类型为:m (Maybe a)
。 unET
函数需要ET m a
并返回其唯一字段,因此unET
的返回类型必须是字段的类型,即m (Maybe a)
和不是< / em> m a
!