Haskell`永远'类型签名

Mac*_*cki 13 monads haskell types type-signature

在Haskell中,为什么是类型签名 forever

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

具体为什么不是这样:: Monad m => m a -> m a呢?当然,我们所采取行动的monad类型并没有改变一半forever

功能如:

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

似乎完全一样.

dfe*_*uer 15

类型签名forever经过精心设计,表明其结果永远存在.具体来说,没有办法编写一个类型的动作m b(返回值中的多态)终止并产生非底部值.提出同样建议的另一种方法是forever' :: m a -> m Void.

另一个答案就是说这是函数的最常用类型,因为它是定义的,所以就是给它的那个.

Prelude> let forever m = let x = m >> x in x
Prelude> :t forever
forever :: Monad m => m a -> m b
Run Code Online (Sandbox Code Playgroud)

这些天,它可能应该以不同的方式定义:

forever :: Applicative f => f a -> f b
forever a = let x = a *> x in x
Run Code Online (Sandbox Code Playgroud)