{-# LANGUAGE RankNTypes #-} ----------------------------------------------------------------------------- -- | -- Module : Linear.Core -- Copyright : (C) 2012-2013 Edward Kmett, -- License : BSD-style (see the file LICENSE) -- -- Maintainer : Edward Kmett -- Stability : experimental -- Portability : non-portable -- -- Corepresentable functors as vector spaces ---------------------------------------------------------------------------- module Linear.Core ( Core(..) ) where -- | -- A 'Functor' @f@ is corepresentable if it is isomorphic to @(x -> a)@ -- for some x. Nearly all such functors can be represented by choosing @x@ to be -- the set of lenses that are polymorphic in the contents of the 'Functor', -- that is to say @x = 'Rep' f@ is a valid choice of 'x' for (nearly) every -- 'Representable' 'Functor'. class Functor f => Core f where core :: ((forall g x. Functor g => (x -> g x) -> f x -> g (f x)) -> a) -> f a