有效果的应用程序设计 ( McBride和Paterson的论文)提到了sequence函数:
sequence :: [IO a ] -> IO [a ]
sequence [] = return []
sequence (c : cs) = return (:) `ap` c `ap` sequence csap的类型是:
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])发布于 2014-12-03 02:35:06
答案是..。跑啊!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)中对该上下文中的值执行函数的应用,恰好它经常被用来执行部分应用程序的序列。
https://stackoverflow.com/questions/27262593
复制相似问题