在Haskell中,为什么forever的类型签名
forever :: Monad m => m a -> m b具体来说,为什么不只是:: Monad m => m a -> m a?当然,我们所采取行动的单一模式不会在forever中途改变。
职能,如:
forever' :: Monad m => m a -> m a
forever' = forever似乎是完全一样的。
发布于 2015-05-11 14:40:32
构建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 xhttps://stackoverflow.com/questions/30170279
复制相似问题