This code now works:

//////////////////////////////////////////
#import <flx.flxh>

typedef fun pair (t:TYPE):TYPE => t * t;
typedef Pair[t] = t * t;
typedef PAIR = fun (t:TYPE):TYPE =>Pair[t];

var x: pair int;

fun f[t,u:TYPE->TYPE] (x: u t)=>x;

var k1 = f[int, the pair] (1,1);
var k2 = f[int, (fun (t:TYPE):TYPE =>Pair[t] ) ] (1,2);
var k3 = f[int, the PAIR] (1,3);
var k4 = f[int, the Pair] (1,3);

print k1.(0); print ","; print k1.(1); endl;
print k2.(0); print ","; print k2.(1); endl;
print k3.(0); print ","; print k3.(1); endl;
print k4.(0); print ","; print k4.(1); endl;
/////////////////////////////////////////////////

Note in particular you can say 'the Pair' to convert
the parameterised type Pair into a type function
with the parameters are type arguments (i.e. a functor).
I think this will only work when the arguments and
return type have kind TYPE, i.e. you can't accept or
return a functor.

This upgrade to the polymorphism should allow things like:

        gen singleton[t,c:TYPE->TYPE]: t -> c = "?2($1)";

        var x = singleton[int, the stl_vector] (1);
        var y = singleton[int, the stl_list] (1);

assuming that stl_vector and stl_list are functors representing
STL containers with constructors that take a 1 element argument.
But I haven't tested it yet .. :)

More generally we'd like to create a single instance of typeclass
XSequence which takes the C++ data functor as an argument.
At present sequence takes 3 arguments

        typeclass Sequence [container, iterator, value] ..

where both container and iterator have to be instantiated over
value. EG

        instance Sequence [vector[int], vector_iterator[int], int]

This prevents abstraction over the value type, since the first
argument, for example, has to be a type such as 'vector[int]'.
We'd rather have

        instance Xsequence[vector, vector_iterator, int]

because we can abstract now:

        instance[t] Xsequence[vector, vector_iterator, t]

and again:

        instance[t, c:TYPE->TYPE, it:TYPE->TYPE] 
        Xsequence[c,it,t]

We could do this with Sequence like:

        .. Sequence[c t, it t,t]

now, since we can pass functors like 'c' and 'it' directly.

Well actually this is only implemented for functions and 
not typeclasses, but the method is established... :)

Haskell typeclasses can do this, and, it is essential for
the Monad typeclass required for monadic programming ..
so we do need this.




-- 
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net

-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier.
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to