Hi,
I am trying to define a commutative operator :
 (%+) :: a -> b -> c
 (%+) :: b -> a -> c
 
instead of defining a class and instantiating twice every time, I am trying to do the following:

class Commutative a b c where
 (%+) :: a -> b -> c
 
class Operation a b c | a b -> c where
 (%+%) :: a -> b -> c
 
instance (Operation a b c) => Commutative a b c where
  (%+) =  (%+%)
 
instance (Operation b a c) => Commutative a b c where
  (%+) = flip (%+%)
 
--
instance Operation Int (Maybe Int) Int where
 i %+% (Just s) = i + s
---

With hugs -98 +mo
((2::Int) %+ (Just (2::Int)))::Int gives 4
But (2::Int) %+ (Just (2::Int)) is of type  Commutative Int (Maybe Int) a => a. So is (Just (2::Int)) %+ (2::Int)
 
Is the dependency in Operation class not sufficient. Any work around?
 
Which flags to be set for Ghc to accept this code. I tried -fallow-overlapping-instances and
-fallow-undecidable-instances.
 
Thanks,
S
 
 
 
 
 
 
 

 

Reply via email to