2015-05-11 1 views
12

В Haskell почему типа подписи foreverHaskell `forever` тип подписи

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

В частности, почему это не просто :: Monad m => m a -> m a? Несомненно, тип монады, на которую мы действуем, не меняется на полпути через forever?

функции, такие как:

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

, кажется, работает точно так же.

+1

Тип монады 'M' и это не меняет. Какие изменения имеет тип результата 'b'. –

ответ

14

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