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'它消除了魔法。 –