Version française
Home     About     Download     Resources     Contact us    

This site is updated infrequently. For up-to-date information, please visit the new OCaml website at

Browse thread
[Caml-list] Translation between datatypes with binding
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: 2004-07-05 (14:36)
From: Jojgov, G.I. <g.i.jojgov@T...>
Subject: [Caml-list] Translation between datatypes with binding

I am relatively new to the OCAML programming, so my question may be
trivial, but did not find related messages in the list archive and I
would appreciate any tips. 

I am trying to use OCAML as a logical framework to implement two systems
with binding and to define a translation from one to the other. Ideally,
I would like to be able to write code like this

	expr1 =
	 SomeValue1 of int |
	 SomeBinder1 of int * (expr1 -> expr1);;
	expr2 = 
	 SomeValue2 of string |
	 SomeBinder2 of string * (expr2 -> expr2);;

let rec translate (term:expr1) : expr2 =
	match term with
		SomeValue1 x -> SomeValue2 (string_of_int x) |
		SomeBinder1 (x,body) -> SomeBinder2 ((string_of_int
x),(function (v:expr2) -> (translate (body v))))

(this is a simplified version of the real datatypes and the translation
that I want to use)

Of course, this code is not type-correct because "(function (v:expr2) ->
(translate (body v)))" is not. If expr1 and expr2 could "behave" like
classes I could have defined a common base class, say "expr", and then
redefine the binders as

	 SomeBinder1 of int * (expr -> expr1);;
	 SomeBinder2 of string * (expr -> expr2);;

and then the code would be "type-correct".

My questions are: Is there a natural way to define a function like the
translation function above on datatypes? Is there another way to
implement these structures? I guess the only solution is to use classes,
but I already have some code dealing with the two concrete types and
preferably I would like to reuse the code.

Thanks in advance for your comments,


To unsubscribe, mail Archives:
Bug reports: FAQ:
Beginner's list: