{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE IncoherentInstances #-} {-# LANGUAGE OverlappingInstances #-} -- | QuickAnnotate Module module QuickAnnotate where -- | Type of source location data type Loc = String -- |'Annotatable' is used for overloading the annotate function added by the preprocessor. class Annotatable a where annotate :: Loc -> a -> a -- | By default all types that do not derive 'Annotatable' expilicitly are annotated by 'id'. instance Annotatable a where annotate _ = id -- | The 'annotate' function ignores types of the arguments in a function (abstraction) and -- annotates the returned value based on its type. For example: -- 'annotate ( \x y -> x )' is equal to '\x y -> annotate x' instance Annotatable b => Annotatable (a -> b) where annotate l f = \x -> annotate l (f x)