Подпись типа Haskell `forever` - программирование

Подпись типа Haskell `forever`

В 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

похоже, работает точно так же.

4b9b3361

Ответ 1

Подпись типа 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