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
participants (1)
-
Saswat Anand