我想知道如何在免費的情況下編寫f x = zip x (tail x)
。所以我使用了免提程序,結果是f = ap zip tail
。 ap
是Control.Monad的一個函數「ap zip tail」的表達方式如何工作
我不明白點自由定義是如何工作的。如果我能從類型的角度理解它,我希望我能弄明白。
import Control.Monad (ap)
let f = ap zip tail
let g = ap zip
:info ap zip tail f g
ap :: Monad m => m (a -> b) -> m a -> m b
-- Defined in `Control.Monad'
zip :: [a] -> [b] -> [(a, b)] -- Defined in `GHC.List'
tail :: [a] -> [a] -- Defined in `GHC.List'
f :: [b] -> [(b, b)] -- Defined at <interactive>:3:5
g :: ([a] -> [b]) -> [a] -> [(a, b)]
-- Defined at <interactive>:4:5
通過觀察表達ap zip tail
我認爲是拉鍊的ap
和尾部的第一個參數是ap
第二個參數。
Monad m => m (a -> b) -> m a -> m b
\--------/ \---/
zip tail
但是,這是不可能的,因爲類型zip
和tail
比什麼功能ap
需要完全不同的。即使考慮到名單是一種單一的。
唯一能想到的是,ap類型中的'a'成爲zip類型的'[a] - > [b]'。如果是這樣的話,那麼統治(如果它是合適的話)統治這一點的規則通常是什麼? – user7610
ghci說,類型是'ap zip tail :: Monad(( - >)[b])=> [b] - > [(b,b)]'......沒有太多的調查,我會說'Monad(( - >)[b])'是你想要閱讀的內容。我*認爲* http://learnyouahaskell.com/for-a-few-monads-more#reader可能會幫助你瞭解這裏發生了什麼。 –
順便說一句,'拉鍊<*> tail'相當於和漂亮尋找 – jozefg