
On Sat, Mar 21, 2015 at 7:31 PM, Chris Wong
[...] class MM a where one :: a
class AM a where zero :: a
class (AM a, MM a) => SR a
class (AM a) => AG a where inv :: a -> a
class (SR a) => R a where neg :: a -> a
class (R r, AG g) => M r g where sca :: r -> g -> g
check :: (Eq g, M r g) => g -> Bool check x = sca one x == x [...]
If I also planned to have M instances like instance M Float Float where ... instance M Int Float where ... instance (M r g) => M r [g] where ... instance (M s u, M s v) => M s (u, v) where ... Which of the three approaches would make for the most idiomatic Haskell (add extra 'r' parameter, functional dependencies or associated types)? Is it common to require a range of language extension pragmas to make this kind of thing work or am I just going about this in a non-idiomatic way? Thanks, Stu