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