如果这样的函数依赖于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
相同
Control.Monad
中的forever
函数具有所需的类型。
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
"一致",因为如果两者都终止,那么它们将具有相同的结果。
所有具有您要求的类型的函数只能返回Nothing
或Just
_|_,其中_|_表示非终止。
forall r. r
类型的一个值是undefined
。因此,获得类型为Monad m => forall r. m r
的值的一种方法是return undefined
。因此,要获得所需类型的函数,您只需编写:
foo :: Monad m => m a -> forall r. m r
foo m = m >> return undefined