[Fwd: Re: type class VS struct/functor]

Ahn Ki-yung kyagrd@bawi.org
Sat, 19 Jan 2002 11:59:10 +0900


Hmm ... How do you solve this in Haskell ?

-------- Original Message --------
Subject: Re: type class VS struct/functor
Date: Sat, 19 Jan 2002 01:34:32 GMT
From: neelk@alum.mit.edu (Neelakantan Krishnaswami)
Reply-To: neelk@alum.mit.edu
Organization: ATT Broadband
Newsgroups: comp.lang.functional
References: <3C48C86E.9282BE00@bawi.org>

On Sat, 19 Jan 2002 10:14:22 +0900, =?EUC-KR?B?vsix4r+1?=
<kyagrd@bawi.org>
wrote:
>
> What does ML struct/functor have anything better than type classes ? 
> For the user type classes feels like implicit functor istantiations
> to specific sturucture, and struct/functor seems just bugglling the
> user to do more typing which can be automated by using type classes.

The advantage of functors shows up when you need to have multiple
implementations of a module for a type. For instance, suppose you
want to implement a set, and you write the functors (OCaml below):

  module type EQ =
    sig
      type t
      val eq : t -> t -> bool
    end

  module type SET =
    sig
      type elt
      type set

      val empty : set
      val add : elt -> set -> set
      val mem : elt -> set -> bool
    end

  module Set(Eq : EQ) : SET with type elt = Eq.t = 
    struct
      type elt = Eq.t
      type set = elt list
  
      let empty = []
  
      let add elt set = elt :: set
  
      let rec mem elt set =
	match set with
	|	[] -> false
	|	x :: xs -> if Eq.eq x elt then true else mem elt xs
    end 

Now, suppose you want two kinds of sets of string, one of which is
case-sensitive and one of which is not. You can easily do this with
functors like so

  module SensitiveCase =
    struct
      type t = string
      let eq s s' = (s = s')
    end

  module InsensitiveCase =
    struct
      type t = string
      let eq s s' = (String.lowercase s) = (String.lowercase s')
    end

  module SensitiveSet = Set(SensitiveCase)      
  module InsensitiveSet = Set(InsensitiveCase)

Each of these Set types takes a string, but the membership test is
different. This is an annoying case in Haskell, because you can make a
String a member of the Eq typeclass in only one way.

However, I think it's true that typeclasses are less verbose in the
common case. Personally, I want a language with both typeclasses and
functors, so that I can use either as the problem requires.


Neel