Proposal: Applicative => Monad: Call for consensus
dan.doel at gmail.com
Thu Jan 20 23:47:37 CET 2011
On Thursday 20 January 2011 5:23:56 pm Henning Thielemann wrote:
> Translating for me: liftA2 is essentially pair with subsequent fmap.
Yes. And I didn't mention it, but there's a similar restricted functor
underlying the restricted applicative, which is a functor from a subcategory
of Hask to Hask. So:
rfmap :: (Suitable a, Suitable b) => (a -> b) -> f a -> f b
In the normal applicative case:
pure x = fmap (const x) unit
f <*> x = fmap eval (pair (f, x))
where eval = uncurry ($)
But the latter doesn't make sense if exponentials don't exist.
> I already though about this and came to the conclusion, that this does not
> help in my case. A zipWith3 written as
> pure f <*> storableVectorA <*> storableVectorB <*> storableVectorC
> would require a Storable instance for pairs. I provided that in
> storable-tuple, but then it is not efficient to store intermediate pairs
> in StorableVector.
I can believe it isn't efficient. But it's possible. An implementation more
like vector (for instance) would obviously work out better, because:
unit = UnitVector
pair (l, r) = PairVector l r
instead of building a new vector and copying all the elements. Anyhow, my
mails were more concerned with whether or not these things are 'unprincipled
hacks,' not whether they're practically useful.
More information about the Libraries