2014-12-03 65 views
4

Applicative Programming with Effects,從麥克布萊德和佩特森的紙張,提起sequence功能:用`實施sequence`的`ap`

sequence :: [IO a ] -> IO [a ] 
sequence []  = return [] 
sequence (c : cs) = return (:) `ap` c `ap` sequence cs 

其中ap的類型是:

ap :: Monad m => m (a -> b) -> m a -> m b

我試圖瞭解最後一行右側的類型。

return (:) 'ap' c 'ap' sequence cs這些類型如何統一(我認爲這是正確的措辭)?

我不清楚return (:)如何匹配ap的第一個參數m (a -> b)

ghci> :t return (:) 
return (:) :: Monad m => m (a -> [a] -> [a]) 

回答

7

答案是...... currying! ap的第一個參數的類型爲m (a -> b),所以函數預計 的值爲a,並且將生成類型爲b的值。 b可能是 的一個可能的事情是另一個功能(即,b可以與[a] -> [a]統一)。所以,我們排隊的事情,並得到

ap   :: Monad m => m (a -> b  ) -> m a -> m b 
           ========== 
return (:) :: Monad m => m (a -> [a] -> [a]) 

ap功能在一些情況下執行功能的應用程序(在這種情況下單子)在這方面的值,它只是恰巧,它經常被用來執行一系列部分應用程序。