Haskell `forever` type signature

2019-06-15 02:46发布

In Haskell why is type-signature of forever

forever :: Monad m => m a -> m b

Specifically why isn't it just :: Monad m => m a -> m a? Surely the type of monad we are acting upon doesn't change half way through forever?

A function such as:

 forever' :: Monad m => m a -> m a
 forever' = forever

seems to work exactly the same.

1条回答
beautiful°
2楼-- · 2019-06-15 03:25

The type signature of forever is crafted to suggest that its result runs forever. Specifically, there is no way to write an action of type m b (polymorphic in its return value) that terminates and yields a non-bottom value. An alternative way to suggest the same thing would be forever' :: m a -> m Void.

Another answer is to just say that this is the most general type available for the function as it's defined, so that's the one it was given.

Prelude> let forever m = let x = m >> x in x
Prelude> :t forever
forever :: Monad m => m a -> m b

These days, it probably should be defined differently:

forever :: Applicative f => f a -> f b
forever a = let x = a *> x in x
查看更多
登录 后发表回答