Mi chiedevo come scrivere f x = zip x (tail x)
in punto libero. Quindi ho usato il programma pointfree e il risultato è stato f = ap zip tail
. ap
è una funzione di Control.MonadCome funziona l'espressione `ap zip tail`
Non capisco come funzioni la definizione point free. Spero di riuscire a capirlo se riesco a comprenderlo dal punto di vista dei tipi.
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
Osservando l'espressione ap zip tail
penserei che zip è il primo parametro di ap
e la coda è il secondo parametro di ap
.
Monad m => m (a -> b) -> m a -> m b
\--------/ \---/
zip tail
Ma ciò non è possibile, poiché le forme di zip
e tail
sono completamente diverso da quello che richiede la funzione ap
. Anche tenendo conto che la lista è una sorta di monade.
L'unica cosa che posso inventare è che il 'a' nel tipo di ap diventa il' [a] -> [b] 'del tipo di zip. Se è così, allora quali sono le regole di unificazione (se è la parola giusta) che governano questo in generale? – user7610
ghci dice che il tipo è 'ap zip tail :: Monad ((->) [b]) => [b] -> [(b, b)]' ... senza troppe indagini, direi che 'Monad ((->) [b])' è ciò che vuoi leggere. I * think * http://learnyouahaskell.com/for-a-few-monads-more#reader potrebbe aiutarti a capire cosa sta succedendo qui. –
Per inciso, 'zip <*> tail' è equivalente e più bella cercando – jozefg