是否可以编写签名函数`Monad m => m a - >弗拉尔河m r`这样可以保留原始返回值?

时间:2013-08-29 11:28:43

标签: haskell typeclass

如果此类功能取决于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

相同

2 个答案:

答案 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,如果两者都终止,那么它们将具有相同的结果。

具有您要求的类型的所有函数只能返回NothingJust _ | _,其中_ | _表示不确定。

答案 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