
On Thursday 15 January 2009 6:21:28 pm David Menendez wrote:
On Thu, Jan 15, 2009 at 5:32 PM, Andrew Coppin
wrote: As an aside, the integers form two different monoids. Haskell can't [easily] handle that. Does anybody know of a language that can?
Some of the ML-derived languages can do that. Essentially, your code takes another module which implements a monoid as an argument.
The catch is that you have to explicitly provide the monoid implementation in order to use your code.
You can do that in Haskell, as well, although it will end up uglier than ML. You can write your own dictionary type: data Monoid a = Monoid { unit :: a , bin :: m -> m -> m } And pass that around: twice :: Monoid m -> m -> m twice mon m = bin mon m m And even manually simulate locally opening the dictionary with a where clause twice mon m = m ++ m where (++) = bin mon This is, after all, what GHC translates type classes into behind the scenes (although that isn't necessarily how they must be implemented). Some folks even argue that type classes are overused and this style should be significantly more common. -- Dan