1

如果这样的函数依赖于 monad 的选择,请用Maybe. 在这种情况下,签名将是:

mayall :: Maybe a -> forall r. Maybe r

但是再一次,如果可以进行通用实现,将不胜感激。这里的关键是结果必须是Maybe r,而不是某些特定的数据构造函数,例如Maybe Item对于某些

data Item = forall r. Show r => Item r

如果无法实现,可以使用一些替代签名:

`Monad m => m a -> forall r. n r`

满意?

在上述情况下,n不一定是 monad,如果是,则可能与m

4

2 回答 2

8

forever函数 fromControl.Monad具有您需要的类型。

forever :: Monad m => m a -> m b

请注意,这与

Monad m => m a -> forall r. m r

这与

Maybe a -> forall r. Maybe r

. 但是,我怀疑这可能不是您所追求的。您永远无法从中获得类型的值r。要么你得到Nothing,要么它根本无法终止。同样,const Nothing也具有您要求的类型,并且它“同意”forever如果两者都终止,那么它们将具有相同的结果。

具有您要求的类型的所有函数只能返回NothingJust_|_,其中 _|_ 表示非终止。

于 2013-08-29T13:54:29.763 回答
5

type 的一个值forall r. rundefined。因此,获取类型值的一种方法Monad m => forall r. m rreturn undefined. 因此,要获得所需类型的函数,您只需编写:

foo :: Monad m => m a -> forall r. m r
foo m = m >> return undefined
于 2013-08-29T11:42:16.777 回答