I am currently a PhD student working at Inria Sophia-Antipolis (France) in Indes team and advised by Manuel Serrano.

Haskell type class in OCaml

In Haskell, a declared type may belong to type classes. A type class declare a list of signature like

class Show a where
  show :: a -> string

Then declaring a type belonging to that class is done by declaring a new instance of that class

data Boolean = True | False
instance Show Boolean where
  show True = "True"
  show False = "False"

Then it's possible to call the show function over a Boolean typed object. The system automatically now what instance of the show function to call.

show True

How about OCaml ? We usually do it in that way.

type boolean = True | False
let string_of_boolean = function
  | True -> "True"
  | False -> "False"
print_string (string_of_boolean True)

The problem is that to print a new type we need to define a new function. We would like to have a similar dispatch than Haskell. It is done in OCaml encapsulating the type within the class. First we declare a class show with a single method showing the object

class type show = object
  method show : unit -> string

Then we declare the type.

type boolean = True | False

We declare a class type that will ...

class type iboolean = object
  inherit show

We define a function converting the type to a string representation.

let string_of_boolean = function
  | True -> "True"
  | False -> "False"

Finally we declare the class encapsulating the type.

class cboolean v : iboolean = object
  val v = v
  method show () = string_of_boolean v

Then adding a new type can be done like.

type natural = Zero | Succ of natural

let rec show_natural = function
  | Zero ->  "Zero"
  | Succ n -> "Succ (" ^ (show_natural n) ^ ")"

let rec eq_natural n n' = match (n, n') with
  | (Zero, Zero) -> Yes
  | (Succ n, Succ n') -> eq_natural n n'
  | _ -> No

class type inat = object
  inherit show
  inherit [inat] eq
  method getn : unit -> natural

class nat n : inat = object 
  val n = n
  method show () = show_natural n
  method eq n' = new cyesno (eq_natural n (n'#getn()))
  method getn () = n

Using this mecanism into a main function.

let _ = 
  let o1 = new nat (Zero) in
  let o2 = new nat (Succ(Zero)) in
  print_endline (o1#show()) ;
  print_endline (o2#show()) ;
  print_endline ((o1#eq(o1))#show()) ;
  print_endline ((o1#eq(o2))#show())

I am designing an extension of Hop and Hop.js with an embedded query language that can be applied to multiple data sources. This extension considers any kind of data sources, like classical databases, Web pages, Web services and user-defined structures.


Requesting heterogeneous data sources with array comprehensions in Hop.js Bases de données 2 (Polytech) Yoann.Couillec@inria.fr