Proposal: Add &&& and *** to Data.Tuple
Jon Fairbairn
jon.fairbairn at cl.cam.ac.uk
Mon Sep 17 14:47:33 EDT 2007
Ian Lynagh <igloo at earth.li> writes:
> On Mon, Sep 17, 2007 at 03:23:46PM +0200, Josef Svenningsson wrote:
>>
>> It is becoming increasingly popular to import Control.Arrow just to
>> get access to the functions &&& and *** specialized to the function
>> arrow. I propose to add the specialized version of these two functions
>
> I think that having the same function with different types is likely to
> cause user confusion, and also ambiguous function errors.
>
> (I also think that using a different name for the specialised versions
> would be a bad idea.)
This seems to be a recurrent problem, and I keep wondering
whether there might not be a general solution along the
lines of declaring that an instance of a class at a
particular type subsumes the functions declared with those
names at the specialised type. Taking the current example, in Data.Tuple
there'd be
(***):: (b->c)->(b'->c')->(b,b')->(c,c')
(&&&):: (b->c)->(b->c')->b->(c,c')
f *** g = ...
f &&& g = ...
and in Control.Arrow there'd be
class Arrow a where
...
(***):: a b c -> a b' c' -> a (b, b') (c, c')
(&&&):: a b c -> a b c' -> a b (c, c')
and
instance Arrow (->) where
...
(***) subsumes (Data.Tuple.***)
(&&&) subsumes (Data.Tuple.&&&)
the effect (and type checks) within the Arrow module would
be the same as
import qualified Data.Tuple ((***),(&&&))
instance Arrow (->) where
...
(***) = (Data.Tuple.***)
(&&&) = (Data.Tuple.&&&)
and modules that imported only Arrow (not Tuple) would see
no difference from the present state of affairs. Where
things would be different would be if a module imported both
Tuple and Arrow, when, instead of a name clash, *** and &&&
would get their Arrow meanings (albeit with a specialised
instance for ->).
So if someone wrote a module that used only Tuple but later
needed to import Arrow, nothing untoward would happen -- no
renaming or complicated import hidings would be needed. I
suppose one could describe this as shadowing of names with
the restriction that the shadowed name has to fit the shadow
exactly.
[I have no attachment to the syntax suggested above]
--
Jón Fairbairn Jon.Fairbairn at cl.cam.ac.uk
More information about the Libraries
mailing list