{-# LANGUAGE FunctionalDependencies #-} module Main where class Mult a b c | a b -> c where (.*) :: a -> b -> c -- A quantity with units of a/b newtype Frac a b = Frac {val :: Float} instance Mult (Frac a b) (Frac b a) Float where (Frac x) .* (Frac y) = x*y -- If a=d, this matches above instance, causing a conflict instance Mult (Frac a x) (Frac x d) (Frac a d) where (Frac x) .* (Frac y) = Frac (x*y) main :: IO () main = print "hello, world"