On Wed, 2007-11-28 at 10:55 -0800, Erick Tryzelaar wrote:
> On Nov 28, 2007 8:44 AM, skaller <[EMAIL PROTECTED]> wrote:
> > I wanted to test complex (and float) functions, with code like:

> > The 'right' solution is to use, for example:
> >
> >         str_float (x, (width=10, prec=5, fmt=fixed))
> >
> > [where the second argument is one of those new fangled
> > record things ..] Or something similar of course .. :)
> 
> I like that :)

Ok, we now have:

        fmt[dcomplex,double](z,default (5,2)))

which formats a double precision complex number. The problem
is that unlike the float case, you have to say dcomplex,double.
The function is actually:

  fun fmt[t,r with Complex[t,r]] (v:t, m: mode) =>

but unfortunately the r (underlying real type) cannot be
deduced, even though it is determined by the complex type.

The 'r' is in the typeclass because for example:

  virtual fun imag: t -> r;

needs it. It is easy to write a type function connecting t and r,
indeed there is already a typedef:

typedef complex[t in floats] = typematch t with
  | float => fcomplex
  | double => dcomplex
  | ldouble => lcomplex
  endmatch
;

However this cannot be used in a typeclass, because the
constraint (of t to floats) cannot be represented: 
        typeclass Complex[r] {
          typedef t = complex[r];
          inherit Eq[t];
          ...


This would work I think if the function were parametric, eg

        typedef t = r * r;

is total and constructive, so should be fine. But typematches
can't work on type variables.

Note this problem doesn't arise for floats:

  fun fmt[t in reals] (v:t, m: mode) =>
    match m with
    | default (?w,?p) => fmt_default(v,w,p)
    | fixed (?w,?p) => fmt_fixed(v,w,p)
    | scientific(?w,?p) => fmt_scientific(v,w,p)
    endmatch
  ;

There's no typeclass here. I could solve the problem for complex
easily, by writing a routine in C++ for the complex values,
but it cannot be done in Felix: the actual code:

  fun fmt[t,r with Complex[t,r]] (v:t, m: mode) =>
    match m with
    | default (?w,?p) => 
        fmt_default(real v,w,p) +"+"+fmt_default(imag v,w,p)+"i"
    | fixed (?w,?p) => 
        fmt_fixed(real v,w,p)+"+"+fmt_fixed(imag v,w,p)+"i"
    | scientific(?w,?p) => 
        fmt_scientific(real v,w,p)+"+"+fmt_scientific(imag v,w,p)+"i"
    endmatch
  ;

delegates to compositions of the fmt over the reals.

[Note: the code does work .. you just have put in the [dcomplex,double]:

        fmt[dcomplex,double](z,default (5,2)))

which is very unfortunate]

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

-------------------------------------------------------------------------
SF.Net email is sponsored by: The Future of Linux Business White Paper
from Novell.  From the desktop to the data center, Linux is going
mainstream.  Let it simplify your IT future.
http://altfarm.mediaplex.com/ad/ck/8857-50307-18918-4
_______________________________________________
Felix-language mailing list
Felix-language@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/felix-language

Reply via email to