packages feed

moonlight-core-0.1.0.0: src-numeric/Moonlight/Core/Numeric.hs

{-# LANGUAGE TypeFamilies #-}

-- | Aggregate aliases of the scalar tower: 'OrderedRing', 'OrderedField', and 'ContinuousField' (an ordered field whose magnitude is its own carrier).
module Moonlight.Core.Numeric
  ( OrderedRing,
    OrderedField,
    ContinuousField,
  )
where

import Data.Kind (Constraint, Type)
import Data.Type.Equality (type (~))
import Moonlight.Core.Scalar (Field, Magnitude, Metric, Ring)
import Prelude (Double, Float, Int, Integer, Ord)

type OrderedRing :: Type -> Constraint
class (Ring a, Ord a) => OrderedRing a

type OrderedField :: Type -> Constraint
class (OrderedRing a, Field a) => OrderedField a

type ContinuousField :: Type -> Constraint
class (OrderedField a, Metric a, Magnitude a ~ a) => ContinuousField a

instance OrderedRing Int

instance OrderedRing Integer

instance OrderedRing Double

instance OrderedField Double

instance ContinuousField Double

instance OrderedRing Float

instance OrderedField Float

instance ContinuousField Float