\a -> map ($ a)
è sicuramente bene, ma forse ancora un po 'più è un approccio Applicative
: c'è
<**> :: Applicative f => f a -> f (a -> b) -> f b
che dispone di un'istanza <*> :: [a] -> [a->b] -> [b]
. Sembra molto come quello che vuoi! Devi solo inserire il tuo valore a
in un elenco singleton, per il quale esiste anche una funzione dedicata in Applicative
: pure
.
apply :: Applicative f => a -> f (a -> b) -> f b
apply = (<**>) . pure
Anche se in realtà, avrei preferito limitare la firma a -> [a->b] -> [b]
per questo legame di livello superiore, in quanto Applicative
rende simile si ha la firma più generale possibile, che non è:
apply :: Functor f => a -> f (a -> b) -> f b
apply a = fmap ($ a)
In realtà, la mia soluzione è probabilmente la migliore quando si è in una pipeline, suppongo che sia meglio non definire apply
ma utilizzare (<**>) . pure
direttamente nel codice.
Con le leggi applicative, '((<**>). Puro) yu == u <*> puri == y puro ($ y) <*> u == FMAP ($ y) u' per tutti' Applicative's, ma il l'ultimo è solo più generale. –