On Wed, 2007-07-25 at 01:38 -0700, Erick Tryzelaar wrote:
> So I decided the best way to learn about arrows is to try to implement
> them. However, I'm running into some problems. I've got the
> preliminary typeclass implemented here:
> 
> #import <flx.flxh>
> 
> fun swap[A, B] (a:A, b:B): (B*A) => (b, a);
> 
> typeclass Arrow[M: TYPE->TYPE->TYPE]
> {
>   virtual fun arrow[a, b]: (a->b) -> M a b;
>   virtual fun bind[a, b, c]: M a b -> M b c -> M a c;
>   virtual fun first[a, b, c]: M a b -> M (a*c) (b*c);
>   virtual fun second[a, b, c]: M a b -> M (c*a) (c*b);
> 
>   virtual fun foo[a, b, c] (f:M a b): M (a*c) (c*a) =>
>     arrow (the swap[a, c])
>   ;
> }
> 
> But felix doesn't like this, and reports this:
> 
> //Parsing Implementation std.flx
> //Parsing Implementation main.flx
> Questionable meta typing of term: <T4563> * <T4565>
> Questionable meta typing of term: <T4577> * <T4575>
> Questionable meta typing of term: <T4587> * <T4589>
> CLIENT ERROR
> In return (arrow the swap[a, c]);
> Wrong return type,
> expected : (<T4537:(TYPE 0 -> (TYPE 0 -> TYPE 0))> (<T4587> *
> <T4589>)) (<T4589> * <T4587>)
> but we got (<T4537> (<T4587> * <T4589>)) (<T4589> * <T4587>)
> In ./main.flx: line 12 col 3 to  line 14 col 3
> 11:
> 12:   virtual fun foo[a, b, c] (f:M a b): M (a*c) (c*a) =>
> 13:     arrow (the swap[a, c])
> 14:   ;
> 15: }
> 
> 
> 
> There are three things I see here. First, why is this type
> questionable? 

This means "Skaller has no idea what he's doing". The metatyping
of higher order types is broken.

Basically, it should support a proper kinding system, but I got
rather lost in the implementation and gave up.

> It'd be a little easier to read the return type if my
> named abstract types were used instead of the <T4563> style names. Not
> sure how practical that is though. 

It can probably be done, however the current encoding is something like:

        `BTYP_var of int * btypecode_t

so

        `BTYP_var (42,mt)

which means type variable number 42 with metatype mt.
If this is an ordinary type variable, the meta type with be

        `BTYP_type 0

which is written TYPE in Felix source. 

> Third, aren't these the same times?

The problem here seems to be one of the terms isn't reduced:

> expected : (<T4537:(TYPE 0 -> (TYPE 0 -> TYPE 0))> (<T4587> *
> <T4589>)) (<T4589> * <T4587>)

> but we got (<T4537> (<T4587> * <T4589>)) (<T4589> * <T4587>)

The first term is some type function of kind

        TYPE->TYPE->TYPE 

applied to 

        (A*B)

applied to

        (B*A)


but the second term is the ACTUAL application of the particular
function. That is,

        TYPE->TYPE->TYPE

is the meta-type of the function, whereas

        <T4537>

in the second term is a variable for an actual (type) function,
which has (meta) type TYPE->TYPE->TYPE.

So the compiler is bugged, it doesn't recognize that <T4563>
HAS the type TYPE->TYPE->TYPE, and it should be using the
type it has: instead it is actually applying it.

Of course since it is a variable which isn't instantiated,
it can't apply it, so the term isn't reduced.


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

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to