{-# LANGUAGE TypeFamilies #-} {-| Copyright : Predictable Network Solutions Ltd., 2020-2024 License : BSD-3-Clause Description : Type class for functions, e.g. polynomials. -} module Data.Function.Class ( Function (..) ) where import qualified Data.Map as Map import qualified Data.Set as Set -- | An instance of 'Function' is a type that represents functions. -- Function can be evaluated at points in their 'Domain'. -- -- Examples: Polynomials, trigonometric polynomials, piecewise polynomials, … class Function f where -- | The __domain__ of definition of the function. type Domain f -- | The __codomain__ of a function is the set of potential function values, -- i.e. function values never lie outside this set. -- -- In contrast, the set of actual function values -- is called the __image__ and -- is typically a strict subset of the codomain. type Codomain f -- | Evaluate a function at a point in its 'Domain'. eval :: f -> Domain f -> Codomain f -- | Functions are 'Function'. instance Function (a -> b) where type Domain (a -> b) = a type Codomain (a -> b) = b eval = id -- | @'Map.Map' k v@ represents a function @k -> Maybe v@. -- -- > Domain (Map k v) = k -- > Codomain (Map k v) = Maybe v instance Ord k => Function (Map.Map k v) where type instance Domain (Map.Map k v) = k type instance Codomain (Map.Map k v) = Maybe v eval = flip Map.lookup -- | @'Set.Set' v@ represents a function @v -> Bool@. -- -- > Domain (Set v) = v -- > Codomain (Set v) = Bool instance Ord v => Function (Set.Set v) where type Domain (Set.Set v) = v type Codomain (Set.Set v) = Bool eval = flip Set.member