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

What is the type of a very simple unwrap function for a transformed monad?

我正在使用 http://www.cs.nott.ac.uk/~nhn/MGS2006/LectureNotes/lecture03-9up.pdf

中介绍的 monad 转换器进行练习

我有一个 error transformer 的实现,其内容如下:

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,我在类似问题的答案中找到了它们。还是不开心。

感谢您的关注。

看看定义就知道了:

unET (ET m) = m

您知道 ET 的唯一字段具有类型:m (Maybe a)unET 函数采用 ET m a 并且 return 是它唯一的字段,因此 unET 的 return 类型必须是字段的类型,即 m (Maybe a) 不是 m a!