使用`ap`实现`sequence`

时间:2014-12-03 02:20:55

标签: haskell

来自McBride和Paterson的论文

Applicative Programming with Effects提到了sequence函数:

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])

1 个答案:

答案 0 :(得分:7)

答案是......好奇! 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函数在某个上下文(在本例中为monad)中将函数应用于该上下文中的值,恰好它通常用于执行部分应用程序序列。 / p>