Haskell `forever` 类型签名

标签 haskell types monads 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 类型的操作。 (其返回值是多态的)终止并产生一个非底部值。提出相同建议的另一种方法是 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/

相关文章:

java - 将子类分配给每个数组元素(运行时类型)

c++ - 无法确定为什么函数调用中从 char* 到 char 的无效转换

haskell - 理解类型类声明中的类型参数

javascript - 如何将 jQuery 函数作为另一个函数的参数传递?

json - 带有 Aeson 的任意 JSON 键 - Haskell

haskell - 如何加速我的 Haskell 程序(达到 Python 的水平)

haskell - 如何使 fmap 重写规则触发?

冲突类型

haskell - 理解一个 monad 实例

haskell - Par函数底层逻辑