
I knew there must be a way in GHC to do that second example!
As for the third example, it might be a slick way to do some
super-hyper-refactoring, but I admit I can't think of anything it
would be actually necessary for offhand.
--Grady
On 1/12/07, Cale Gibbard
On 12/01/07, Grady Lemoine
wrote: Is there anything in particular you're trying to accomplish? It seems like this is the type of thing you'd accomplish with typeclasses if you had a less general problem than you've presented. For example,
mapShowTuple :: (Show a, Show b) => (a, b) -> (String, String) mapShowTuple (x, y) = (show x, show y)
That said, it would be nice do be able to do something a little more general, but still with a specific typeclass, like
mapNumOpTuple :: (Num a, Num b) => (Num c => c -> c) -> (a, b) -> (a, b) mapNumOpTuple f (x, y) = (f x, f y)
(This unfortunately fails to typecheck; GHC chokes with "Illegal polymorphic or qualified type". On the other hand, I'm still pretty new to Haskell myself, so maybe someone else knows how to write this correctly without doing complex type hackery.)
It's close:
{-# OPTIONS_GHC -fglasgow-exts #-}
mapNumOpPair :: (Num a, Num b) => (forall c. Num c => c -> c) -> (a, b) -> (a,b) mapNumOpPair f (x,y) = (f x, f y)
It would also be nice to be able to generalize over all typeclasses, e.g. (pseudo-code here)
mapTypeclassOpTuple :: for all typeclasses C ((C a, C b) => (C c => c -> c) -> (a, b) -> (a, b))
but I don't even know how that would fit into Haskell's syntax. I suspect it's an idea that's been discussed, and I just don't know the term for it.
That's an interesting idea, typeclass variables. It would require a bit of a kind system for typeclasses, but that's not so hard. I somehow doubt it would get used all *that* much though. Can anyone think of a clever way to apply this?
- Cale