{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-} module Geometry.Class where class Geometry point geodesic | point -> geodesic, geodesic -> point where distance :: point -> point -> Double angle :: point -> point -> point -> Double geodesic :: point -> point -> geodesic rotate :: Double -> point -> point -> point translate :: Double -> geodesic -> point -> point midpoint :: point -> point -> point midpoint p q = translate (distance p q / 2) (geodesic p q) p class Embedding model point where embed :: point -> model model :: model -> Maybe point