Richard Uhtenwoldt <[EMAIL PROTECTED]> writes: [...]
> My reason for posting is to > bring attention to how something similar is done in the language merd, > whose designer posts here under the name pixel, and which > is actually implemented I think. not really. still coding... :) [...] > http://merd.sourceforge.net/types.png Was in too small resolution, fixed. Try http://merd.sourceforge.net/types.pdf for nicer display. > In addition, merd has a type called a struct, written a |&| b. > For reasons I do not understand, instead of defining, eg, > > point = (double,double) > > or > > point = (Point,double,double) > > pixel prefers to define > > point = (X,double) |&| (Y,double) The reason is tuples do not have any subtyping relationship (unless you add it, but it gets ugly ;p) (it also enforces that record fields are not ordered) The |&| is defined elsewhere[1] as /\ aka the intersection type operator (maybe i should rename it, |&| is ugly, /\ is not bad...) It is generally used as a record subtyping operator. It is also used for ad'hoc overloading: show !! String -> String |&| Int -> String [2] but in fact, it can be useful in many areas, if you allow |&| to work on values: default_val = 0 |&| [] [ 1, "foo" ].map(x -> x + 1|&|"bar") #=> [ 2, "foobar" ] - type of [ 1, "foo" ] is List(1 | "foo") (just like type of [ True, False ] is List(Bool) where Bool = True | False) - (x -> x + 1|&|"bar") is alike (x -> x + 1) |&| (x -> x + "bar") so the type is Int->Int |&| String->String [3] - the result is of type List(String | Int) [4] for pattern matching: "(\s+):(\d+)" returns String, String|&|Int allowing the use with no cast as an Int and/or as a String [1] Intersection Types and Bounded Polymorphism http://citeseer.nj.nec.com/54630.html [2] can be factorised as show !! String|Int -> String [3] well in fact + !! o,o -> o where o !< &Addable so the type is x -> x where 1|&|"bar" !< x !< &Addable which gives x -> x where x !< String|Int when going to the closed world where + is defined for types Int and String [4] hum, in fact merd evaluates what it can at compile time, so the type is the type of [ 2, "foobar" ] which is List(2 | "foobar") -- Pixel _______________________________________________ Haskell mailing list [EMAIL PROTECTED] http://www.haskell.org/mailman/listinfo/haskell