如果这样的功能取决于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
在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,如果两者都终止,那么它们将具有相同的结果.
具有您要求的类型的所有函数只能返回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
Run Code Online (Sandbox Code Playgroud)