Richard Uhtenwoldt <greon@best.com> 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... :) [...]
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