Я задавался вопросом, как написать 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
. Даже с учетом того, что список является монадой.