1
我正在阅读纸张应用编程效果来自Conor McBride和Ross Paterson,我无法弄清楚为什么他们的第一段代码是typechecks。 (我有很强的OCaml背景和弱的haskell背景)。它为什么会检查和如何?
有一个功能ap
从Control.Monad
有以下类型:
ap :: Monad m => m (a -> b) -> m a -> m b
此功能可以很容易地这样写的:
ap mf mx = do { f <- mf ; x <- mx ; return (f x) }
然后,他们写:
sequence :: [IO a] → IO [a]
sequence [] = return []
sequence (c : cs) = return (:) `ap` c `ap` sequence cs
我的问题是,我不知道如何制定0的类型,因为(:)
的类型与m (a -> b)
无关,因为它是a -> ([a] -> [a])
。
ap (Just (:))
的类型是Maybe a -> (Maybe ([a] -> [a]))
正如预期的那样,但类型检测器告诉我,ap (:)
的类型是(a -> [a]) -> a -> [a]
。这怎么可能?
感谢您的解释,并指出Monad实例( - >)a'它消除了魔法。 –