我想知道如何f x = zip x (tail x)
免费写。所以我使用了 pointfree 程序,结果是f = ap zip tail
. ap
作为 Control.Monad 的一个函数
我不明白无点定义是如何工作的。我希望我能从类型的角度来理解它。
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
,我认为 zip 是 的第一个参数,ap
而 tail 是 的第二个参数ap
。
Monad m => m (a -> b) -> m a -> m b
\--------/ \---/
zip tail
但这是不可能的,因为 和 的类型zip
与函数所需tail
的完全不同。ap
即使考虑到列表是一种单子。