-- | Symantic for 'Ratio'.
module Language.Symantic.Lib.Ratio where
+import Data.Eq (Eq)
+import Data.Function (($))
+import Data.Maybe (Maybe(..))
+import Data.Ord (Ord)
import Data.Ratio (Ratio)
+import Prelude (Fractional, Integral, Num, Real, RealFrac)
+import Text.Show (Show)
import qualified Data.Ratio as Ratio
import Language.Symantic
import Language.Symantic.Lib.Integral (tyIntegral)
-- * Class 'Sym_Ratio'
-type instance Sym (Proxy Ratio) = Sym_Ratio
+type instance Sym Ratio = Sym_Ratio
class Sym_Ratio term where
ratio :: Integral a => term a -> term a -> term (Ratio a)
numerator :: term (Ratio a) -> term a
instance (Sym_Ratio term, Sym_Lambda term) => Sym_Ratio (BetaT term)
-- Typing
+instance NameTyOf Ratio where
+ nameTyOf _c = ["Ratio"] `Mod` "Ratio"
instance FixityOf Ratio
instance ClassInstancesFor Ratio where
- proveConstraintFor _ (TyApp _ tq@(TyConst _ _ q) (TyApp _ c a))
+ proveConstraintFor _ (tq@(TyConst _ _ q) :$ c:@a)
| Just HRefl <- proj_ConstKiTy @_ @Ratio c
= case () of
_ | Just Refl <- proj_Const @Eq q
- , Just Dict <- proveConstraint (tq `tyApp` a) -> Just Dict
+ , Just Dict <- proveConstraint (tq`tyApp`a) -> Just Dict
| Just Refl <- proj_Const @Show q
- , Just Dict <- proveConstraint (tq `tyApp` a) -> Just Dict
+ , Just Dict <- proveConstraint (tq`tyApp`a) -> Just Dict
| Just Refl <- proj_Const @Real q
, Just Dict <- proveConstraint (tyIntegral a) -> Just Dict
| Just Refl <- proj_Const @Ord q
-- Compiling
instance Gram_Term_AtomsFor src ss g Ratio
-instance (Source src, Inj_Sym ss Ratio) => ModuleFor src ss Ratio where
- moduleFor _s = ["Ratio"] `moduleWhere`
+instance (Source src, SymInj ss Ratio) => ModuleFor src ss Ratio where
+ moduleFor = ["Ratio"] `moduleWhere`
[ "ratio" := teRatio
, "numerator" := teRatio_numerator
, "denominator" := teRatio_denominator
teRatio :: TermDef Ratio '[Proxy a] (Integral a #> (a -> a -> Ratio a))
teRatio = Term (tyIntegral a0) (a0 ~> a0 ~> tyRatio a0) $ teSym @Ratio $ lam2 ratio
-teRatio_numerator, teRatio_denominator :: TermDef Ratio '[Proxy a] (Ratio a -> a)
+teRatio_numerator, teRatio_denominator :: TermDef Ratio '[Proxy a] (() #> (Ratio a -> a))
teRatio_numerator = Term noConstraint (tyRatio a0 ~> a0) $ teSym @Ratio $ lam1 numerator
teRatio_denominator = Term noConstraint (tyRatio a0 ~> a0) $ teSym @Ratio $ lam1 denominator