2015-05-11 123 views
12

在Haskell爲什麼的forever哈斯克爾`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 

似乎工作完全一樣。

+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