Haskell `forever` 类型签名

Haskell `forever` type signature

在 Haskell 为什么 forever

的类型签名是
forever :: Monad m => m a -> m b

具体为什么不只是 :: Monad m => m a -> m a? 当然,我们正在执行的 monad 类型不会在 forever?

中途改变

一个函数如:

 forever' :: Monad m => m a -> m a
 forever' = forever

似乎完全一样。

forever 的类型签名旨在暗示其结果永远运行。具体来说,无法编写终止并产生非底值的 m b 类型的操作(其 return 值是多态的)。提出相同建议的另一种方法是 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

如今,它可能应该有不同的定义:

forever :: Applicative f => f a -> f b
forever a = let x = a *> x in x