如果此类功能取决于monad的选择,请使用Maybe
进行演示。在这种情况下,签名将是:
mayall :: Maybe a -> forall r. Maybe r
但是,如果一般的实施是可能的,那么我将非常感激。这里的关键是结果必须是Maybe r
,而不是某些特定的数据构造函数,例如某些<{p}}
Maybe Item
如果无法实施,可以使用其他签名:
data Item = forall r. Show r => Item r
满意吗?
在上述情况下,`Monad m => m a -> forall r. n r`
不一定是monad,如果是,则可能与n
答案 0 :(得分:8)
forever
中的Control.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
也具有您要求的类型,并且&#34;同意&#34;使用forever
,如果两者都终止,那么它们将具有相同的结果。
具有您要求的类型的所有函数只能返回Nothing
或Just
_ | _,其中_ | _表示不确定。
答案 1 :(得分:5)
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