是否可以编写签名函数Monad m => ma - > forall r.mr`这样保留原始返回值?

chi*_*ro2 1 haskell typeclass

如果这样的功能取决于monad的选择,请演示Maybe.在这种情况下,签名将是:

mayall :: Maybe a -> forall r. Maybe r
Run Code Online (Sandbox Code Playgroud)

但是,如果一般的实施是可能的,那么我将非常感激.这里的关键是,其结果必须是Maybe r,没有一些具体的数据构造,如Maybe Item一些

data Item = forall r. Show r => Item r
Run Code Online (Sandbox Code Playgroud)

如果无法实现,可以使用其他签名:

`Monad m => m a -> forall r. n r`
Run Code Online (Sandbox Code Playgroud)

满意?

在上面的例子中,n不一定是monad,如果是,它可能是相同的m

Jak*_*hur 8

forever从功能Control.Monad有你需要的类型.

forever :: Monad m => m a -> m b
Run Code Online (Sandbox Code Playgroud)

请注意,这与

Monad m => m a -> forall r. m r
Run Code Online (Sandbox Code Playgroud)

与...结合

Maybe a -> forall r. Maybe r
Run Code Online (Sandbox Code Playgroud)

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

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


sep*_*p2k 5

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

foo :: Monad m => m a -> forall r. m r
foo m = m >> return undefined
Run Code Online (Sandbox Code Playgroud)