{-# LANGUAGE OverlappingInstances, MultiParamTypeClasses, FunctionalDependencies, FlexibleContexts, FlexibleInstances, UndecidableInstances, NoMonomorphismRestriction #-} import qualified Prelude import Prelude hiding ((+), (*)) import Prelude () class Times a b c | a b -> c where (*) :: a -> b -> c instance Times Int Int Int where (*) = (Prelude.*) instance Times Double Double Double where (*) = (Prelude.*) instance (Times a b c) => Times a (Matrix b) (Matrix c) where l * (r', c', m) = (r', c', \i -> l * m i) instance Times (b -> c) (a -> b) (a -> c) where f * g = f . g instance (Times a b c) => Times a (r -> b) (r -> c) where x * g = \v -> x * g v instance Times (a -> b) a b where f * y = f y type Matrix a = (Int, Int, (Int, Int) -> a) test = (2*(\x -> 2*x))*6 main = undefined