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
在 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