[Haskell] Per-type function namespaces (was: Data.Set whishes)
ozone at algorithm.com.au
ozone at algorithm.com.au
Fri Feb 27 04:41:43 EST 2004
On 27/02/2004, at 3:47 AM, Keith Wansbrough wrote:
>> I've had an idea stewing in my head to do with per-type function
>> namespaces, that the current module namespace discussion reminded me
>> about. The problem is that there is a limited namespace for
>> functions,
>> so that if you define a new data type, it is unwise to call functions
>> which work on that data type a very generic name such as 'add'.
> [..]
>> The idea that I've been throwing around is to be able to define a
>> separate namespace for each type; a function can either belong in a
>> "global" (default) namespace, or belong in a particular type's
>> namespace.
>
> This feature would seem to be in competition with type classes; could
> you elaborate on the relative advantages and disadvantages? The type
> class story has the advantage of being well understood and quite
> effective, but there are certainly some limitations too.
I don't think type classes can solve the problem I'm trying to tackle.
As an example of why, check out the types of FiniteMap and Set's 'add'
functions:
addToFM :: Ord key => FiniteMap key elt -> key -> elt -> FiniteMap key
elt
addToSet :: Ord a => Set a -> a -> Set a
Note that the type of addToFM takes in two parameters (besides the
FiniteMap itself): a key and an element, whereas the type of addToSet
only takes in one parameter, which is the thing to add. So, how can
you come up with a type class which provides a polymorphic 'add'
function, considering you don't even know how many parameters each data
type's individual add function uses?
Even if you could define such a type class (which I don't think is
possible), you then have one less function in the namespace to use,
which is another problem. For example, say I'm writing the
Data.Complex module; there's a function in that module "phase ::
RealFloat a => Complex a -> a". So, how do you put this phase function
into a type class? Perhaps you could abstract away from the RealFloat
and Complex bits, so you have a phase function which is generalised to
work over a Num and an arbitrary data type instead; e.g. "class Phase c
where phase :: Num a => c a -> a". But what happens if, say, somebody
adds a Moon data type, and they want to write a phase function which
returns the phase of such a moon? Phases of the moon certainly aren't
Nums, nevermind the fact that you probably want to supply your moon
phase's function with some sort of date as an extra parameter, which
means the Phase type class isn't flexible enough.
Type classes are designed to provide a type-consistent interface to
functions which perform different behaviour, unifying them as one
function like + or == -- but it's designed to work for arbitrary types.
What I'm after is an interface for a function which may change
depending on a "primary" type it's working with, which is almost the
opposite to type classes.
--
% Andre Pang : trust.in.love.to.save
More information about the Haskell
mailing list