变换monad的非常简单的展开函数的类型是什么?

时间:2015-06-25 06:55:27

标签: haskell monads monad-transformers

我正在使用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函数的类型是什么?

我已经尝试了魔法编译器法术NoMonomorphismRestrictionMonoLocalBinds,我在类似问题的答案中找到了它。仍然没有快乐。

感谢您的关注。

1 个答案:

答案 0 :(得分:4)

看看定义:

unET (ET m) = m

您知道ET的唯一字段类型为:m (Maybe a)unET函数需要ET m a并返回其唯一字段,因此unET的返回类型必须是字段的类型,即m (Maybe a)不是< / em> m a