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)