[Haskell-cafe] Comments from OCaml Hacker Brian Hurt

Dan Doel dan.doel at gmail.com
Thu Jan 15 18:36:42 EST 2009

On Thursday 15 January 2009 6:21:28 pm David Menendez wrote:
> On Thu, Jan 15, 2009 at 5:32 PM, Andrew Coppin
> <andrewcoppin at btinternet.com> 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

More information about the Haskell-Cafe mailing list