[Haskell-cafe] Language extensions [was: Memoization]
Andrew Coppin
andrewcoppin at btinternet.com
Tue May 29 16:28:07 EDT 2007
Claus Reinke wrote:
>
>> I'm thinking more about things like phantom types, rank-N
>> polymorphism, functional dependencies, GADTs, etc etc etc that nobody
>> actually understands.
>
> this seems to be overly polymorphic in generalising over all types of
> Haskell programmers, rather than admitting the existence of some types
> of programmers who might have different values. qualifying such
> generalisations by grouping types of programmers into classes with
> different methods would seem a more Haskellish way, don't you think?-)
>
> and although it isn't nice to typecast people, sometimes one only needs
> to know the type, not the person, and sometime one needs even less
> information, such as a property of a type or its relation to other
> types. and especially if one is interested in relationships between
> different types, it is helpful to know if one type of person in such a
> relationship always occurs in combination with one and the same other
> type. and if there are times when one might even generalise over
> generalisations (although one doesn't like to generalise over so many
> people all at once;-), there are other times when one might need to be
> rather specific about which of several possible alternative types one is
> putting together in a single construction.
>
> there, does that cover everything in that list? sorry, couldn't
> resist!-)
Hahahaha!
Thanks for a good laugh! I should print this out and *frame* it or
something...
> in exchange, below is a quick summary (didn't we have a
> dictionary/quick-reference somewhere at haskell.org? i can't seem to
> find it right now, but if you know where it is, and it doesn't
> already contain better explanations, feel free to add the text below -
> but check the draft for errors first, please;)
>
> claus
>
> ------------------------------
> phantom types:
> the types of ghost values (in other words, we are only interested in
> the type, not in any value of that type).
Mmm... Still not seeing a great amount of use for this one.
> quantified types (forall/exist):
> an easy way to memorize this is to think of 'forall' as a big 'and'
> and of 'exists' as a big 'or'.
> e :: forall a. a -- e has type 'Int' and type 'Bool' and type ..
> e :: exists a. a -- e has type 'Int' or type 'Bool' or type ..
That doesn't entirely make sense. (What am I on about? That doesn't make
*any* sense...)
> rank-N polymorphism:
> in rank-1 polymorphism, type variables can only stand for monomorphic
> types (so, '($) :: (a->b) -> a -> b' can only apply monomorphic
> functions to their arguments, and polymorphic functions are not
> first-class citizens, as they cannot be passed as parameters without
> their types being instantiated). in rank-N (N>1) polymorphism,
> type-variables can stand for rank-(N-1) polymorphic types (in other
> words, polymorphic functions can now be passed as parameters, and used
> polymorphically in the body of another function).
>
> f :: (forall a. [a]->Int) -> ([c],[d]) -> (Int,Int)
> f g (c,d) = (g c,g d)
>
> f length ([1..4],[True,False])
It's actually news to me that you can't do this already... (!)
> functional dependencies:
> when using multi-parameter type classes, we specify relations between
> types (taken from the cartesian product of type class parameters).
>
> without additional measures, that tends to lead to ambiguities (some
> of the type class parameters can not be deduced unambiguously from the
> context, so no specific type class instance can be selected).
>
> functional dependencies are one such measure to reduce ambiguities,
> allowing us to specify that some subset A of type-class parameters
> functionally determines another subset B (so if we know the types of
> the parameters in subset A, there is only a single choice for the
> types of the parameters in subset B).
Functional dependancies kind of make sense. Personally I like the idea
of associated types better, but never mind.
> gadts:
> what really makes them different is that
> the explicit type signatures for the data constructors can give more
> specific return types for the data constructs, and such more specific
> types can be propagated through pattern matching
Finally, a definition of GADTs that actually makes some kind of sense...
(I find it highly unlikely I'll ever need these, but at least I have
some idea now what they're supposed to do.)
More information about the Haskell-Cafe
mailing list