{-# LANGUAGE FunctionalDependencies, FlexibleInstances #-} class Mult a b | a -> b where mult :: a -> b -> a (|*) :: (Mult a b) => a -> b -> a a |* b = mult a b (*|) :: (Mult a b) => b -> a -> a b *| a = mult a b instance Mult [Char] Int where mult s n = concat $ replicate n s