
"Co-lift" is not possible for functors generally. Comonads have a method
extract :: Comonad w => w a -> a, which is somewhat related.
Distributing and gathering are both really distributing. The first example
distributes [] over f while the second example distributes f over [].
Neither are possible for functors generally, but Applicative and
Data.Traversable are strong enough to provide sequenceA :: (Traversable t,
Applicative f) => t (f a) -> f (t a). The problem is that the Applicative
and Traversable laws alone are not enough to guarantee that this is well
behaved.
What you actually need is a stronger notion that f (g a) is an
"f-structure" containing "g-structures" *all of the same shape*. If they
aren't, the inner structures won't be distributed properly and some of the
odd shaped bits might get cut off. For example, try to transpose a list of
lists (iow, distribute [] over []) and you'll see that all of the inner
lists must be the same length for your transposition to be well behaved.
Conor McBride covers this in a very interesting way in this StackOverflow
answer: http://stackoverflow.com/a/13100857/2225384
On Wed, Mar 2, 2016 at 2:50 PM Joel Neely
IIUC, one would describe fmap as "lifting" a function g into a functor f, in the sense of
Functor f => (g a b) -> g a -> g b
Is there an inverse concept (? co-lift ?) that describes
Functor f => (g a -> g b) -> a -> b
Similarly is there standard terminology for "distributing" and "gathering" in the sense of
Functor f => f [a] -> [f a]
and
Functor f => [f a] -> f [a]
respectively?
References much appreciated! -jn-
-- Beauty of style and harmony and grace and good rhythm depend on simplicity. - Plato _______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners