是否可以编写签名 'Monad m => m a -> forall r. m r' 的函数,以便保留原始返回值?



如果这样的函数依赖于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"一致",因为如果两者都终止,那么它们将具有相同的结果。

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

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

最新更新