[Alice-users] Re: CTM Chapter 4

Andreas Rossberg rossberg at ps.uni-sb.de
Sun May 8 20:07:47 CEST 2005


Chris Rathman <chrisr at virtualcommitment.com>:
>
> Didn't realize until a few minutes ago that Alice has a
> byNeed function which probably is the way I should have translated some of
> the examples (I just interspersed lazy which I believe has the same
> semantics).

Yes, byneed is simply defined as

  fun byneed f = lazy f ()

> Only other thing that I'm not sure I understand the full implications is
the
> statement in the Haskell section about how SML and Oz can achieve an
effect
> similar to Haskell classes by using functors.  No code hangs off that
> section, though I figure it might help to know how one can emulate Haskell
> classes within ML.

Type classes are indeed somewhat similar to modules. You can view a type
class as a special form of signature over some type (or several types, if
you consider multi-parameter type classes). An instance of that class
corresponds to a module matching the signature. For example,

  class Eq a where
    (==) :: a -> a -> Bool

  instance Eq Int where
    (==) = primIntEq

roughly maps to

  signature EQ =
  sig
    type t
    val == : t * t -> bool
  end

  structure EqInt : EQ =
  struct
    type t = int
    val op== = primIntEq
  end

Using a class method is something like accessing a specific module with a
known signature without mentioning it explicitly - type inference figures
out which module is meant.

  (==) 3 4

would mean

  EqInt.== (3, 4)

Functors come into play when you have instances that are restricted by a
context, e.g.

  instance Eq a => Eq [a] where
    [] == [] = True
    (x:xs) == (y:ys) = x == y && xs == ys
    _ == _ = False

This is related to a functor

  functor EqList (EqA : EQ) : EQ =
  struct
    type t = EqA.t list
    fun [] == [] = true
      | (x::xs) == (y::ys) = EqA.== (x, y) andalso xs == ys
      | _ == _ = false
  end

But again, instead of requiring the programmer to explicitly apply the
functor, type inference figures out which instances are needed.

So in a first approximation, you can see type classes as a simple module
mechanism plus some fancy type inference magic that makes its use more
convenient. This convenience can be so significant that it provides a whole
new level of expressive power, especially since type classes cooperate much
better with polymorphism than ML modules do. On the other hand, modules are
a much more general mechanism with wider scope, and type classes do not
address issues like type abstraction and programming-in-the-large.

Merging both concepts is still largely an open issue, raising more difficult
questions than one might think at first.

Hope this helps,

  - Andreas




More information about the alice-users mailing list