Browse thread
Type constraints
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: | 1997-06-02 (12:22) |
From: | Wolfgang Lux <lux@h...> |
Subject: | Re: Type constraints |
> Hello. I have the folowing problem. I need to define some interrelated > types as follows: > > type 'a node = {x: 'a; y: t1} > and t1 = A | B of t1*t1 > and t2 = C | D of (string * t2) node > > The interpreter prints the inferred type: > > type 'a node = { x: 'a; y: t1 } constraint 'a = string * t2 > type t1 = | A | B of t1 * t1 > type t2 = | C | D of (string * t2) node > A simple solution to get rid of the type constraint in this case, is to reorder the type definitions as follows: type t1 = A | B of t1*t1 type 'a node = {x: 'a; y: t1} type t2 = C | D of (string * t2) node > Now, if I add another constructor: > > type 'a node = {x: 'a; y: t1} > and t1 = A | B of t1*t1 > and t2 = C | D of (string * t2) node | E of bool node > > I obtain this message: > > Characters 98-102: > This type parameter bool should be an instance of type string * t2 > > A solution to this would be something like: > > type ('a,'b) node = {x: 'a; y: 'b} > and t1 = A | B of t1*t1 > and t2 = C | D of (string * t2, t1) node | E of (bool, t1) node > > This works, but I am not sure to understand the type clash in the former > example. Why did the type synthetizer infer that constraint? I'm not absolutely sure on this, but it looks just like another case of the monomorphic recursion restriction of the Hindley-Milner type system. > > Thank you for any insights on this. > Hope this helps. Regards Wolfgang ---- Wolfgang Lux WZH Heidelberg, IBM Germany Phone: +49-6221-59-4546 Fax: +49-6221-59-3500 Internet: lux@heidelbg.ibm.com Office: mazvm01(lux)