----- Begin Included Message -----

>From [EMAIL PROTECTED] Tue Feb  6 11:07 MET 1996
Date: Tue, 6 Feb 1996 11:07:26 +0100
From: [EMAIL PROTECTED] (Denis WALLEZ)
To: [EMAIL PROTECTED]
Subject: fully defined type vs. class , as a result of function
 
Hi,

I was wondering how it is possible to use classes in a project I have
to make symbolic calculus in Haskell. Since I have to do it in
several programming languages, I want to apply quite the same basic design,
an expression is a tree:

a+b =>  +
       / \
      a   b

Well, the interest of symbolic calculus is the modification of the 
trees WITHOUT evaluation ; for instance
 what_s_the_slope ( tree=> a, variable => a) = 1
or simplify(tree=>(a-0)) = (leaf a)

I started a little exemple like this:
>class Derivable a where
>   derive :: (Derivable b)=> a -> b
I make the hypothesis that the result of derivation is still derivable,
BUT not necessarily the same kind as the initial upper node value:
(fg)'=(f'g)+(fg')    the upper node of tree is first a multiplication,
but the second is an addition... no conservation.

>data Op_bin = Plus (Op_bin) (Op_bin)
>            | Times (Op_bin) (Op_bin)

>instance Derivable Op_bin where
>   derive (Plus a b) = Plus (derive a) (derive b) 
>   derive (Times a b) = Plus (Times (derive a) b) (Times a (derive b))

This seem quite coherent. I thought I could then define
data Op_1 = Val_int (Int)
          | Val_var [Char]
          | Val_float (Float)

instance Derivable Op_1 where
   derive (Val_var x) | x=="x" = Val_int 1
                      | otherwise = Val_int 0
   derive _ = Val_int 0

But no way to do this:
(with HUGS, which is declared fully implementing Haskell)

Reading script file "test4.hs":
Type checking      
ERROR "test4.hs" (line 8): Declared type too general
*** Expression    : derive
*** Declared type : Opbin -> a
*** Inferred type : Opbin -> Opbin

This is not OK. If I make another class with a 'simplify' function,
the result simplify(a+b)=(a+b) with no hypothesis on a and b, but
symplify(1+2)=Val_int 3... so I NEED to make my declarations such as
I can return ANY type in the class With_simplify. 
Since the idea I had was to simplify the result of the naive derivation,
before returning it (i.e. Op_bin should be also an instance of 
With_simplify), I NEED the 'general' declaration for the derivation.


How can I achieve this ?
Does Haskell need ANYWAY a fully defined type when defining the
 type of the result of a function ?
If there's a way to round the difficulty, what is it, or do you have
any pointer ?

Thanks a lot in advance.
Denis.

Denis WALLEZ   --- TELECOM BRETAGNE \ 3A-IPR \ technopole Brest-Iroise 
(98 00 18 12)  --- 29280 PLOUZANE        [EMAIL PROTECTED]
fax 98 00 11 90 (preciser: "pour WALLEZ- 3A")
Team Ada       --- e-mail >> fax >> phone


----- End Included Message -----



Reply via email to