在 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
类型的操作。 (其返回值是多态的)终止并产生一个非底部值。提出相同建议的另一种方法是 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
关于Haskell `forever` 类型签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30170279/