转换后的 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
函数的类型是什么?
我已经尝试过神奇的编译器咒语 NoMonomorphismRestriction
、MonoLocalBinds
,我在类似问题的答案中找到了它们。还是不开心。
感谢您的关注。
看看定义就知道了:
unET (ET m) = m
您知道 ET
的唯一字段具有类型:m (Maybe a)
。 unET
函数采用 ET m a
并且 return 是它唯一的字段,因此 unET
的 return 类型必须是字段的类型,即 m (Maybe a)
和 不是 m a
!
我正在使用 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
函数的类型是什么?
我已经尝试过神奇的编译器咒语 NoMonomorphismRestriction
、MonoLocalBinds
,我在类似问题的答案中找到了它们。还是不开心。
感谢您的关注。
看看定义就知道了:
unET (ET m) = m
您知道 ET
的唯一字段具有类型:m (Maybe a)
。 unET
函数采用 ET m a
并且 return 是它唯一的字段,因此 unET
的 return 类型必须是字段的类型,即 m (Maybe a)
和 不是 m a
!