interface FromNat a where
fromNat : Nat -> a
import nécessaire.FromNat — surcharge des littéraux numériques
Synopsis
interface FromNat a wheredata Rational = Rat Int Intinterface FromDecimal a whereinterface Additive a whereinterface Multiplicative a whereinterface Additive a => AdditiveGroup a whereinterface Abs a whereinterface Additive a => Multiplicative a => Semiring a where {}interface Semiring a => EuclideanDiv a whereinterface Semiring a => AdditiveGroup a => Ring a where {}interface Ring a => CommutativeRing a where {}interface CommutativeRing a => EuclideanDiv a => EuclideanRing a where {}interface Ring a => DivisionRing a wherepi : Doubleinterface Floating a where
Rational — nombres rationnels exacts
data Rational = Rat Int Int
FromDecimal — surcharge des littéraux décimaux
interface FromDecimal a where
fromDecimal : Rational -> a
Permet aux littéraux décimaux (3.14, 0.5, ...) de fonctionner pour tout type muni d'une instance FromDecimal — Double, Rational, et vos propres types.
Additive — addition et zéro
interface Additive a where
(+) : a -> a -> a
zero : a
Un type muni d'une addition et d'un élément zéro.
Multiplicative — multiplication et un
interface Multiplicative a where
(*) : a -> a -> a
one : a
Un type muni d'une multiplication et d'un élément un.
AdditiveGroup — soustraction et négation
interface Additive a => AdditiveGroup a where
negate : a -> a
(-) : a -> a -> a
Soustraction et négation. Uniquement pour les types qui admettent des valeurs négatives (Int, Double). Nat n'a pas d'AdditiveGroup — utiliser checkedSub ou monus.
interface Abs a where
abs : a -> a
Valeur absolue : retire le signe. Une CLASSE, donc chaque type signé fournit la sienne (un type utilisateur aussi). abs (-5) = 5, abs 5 = 5. (Nat est toujours non négatif, donc n'est pas une instance.)
Semiring — addition et multiplication avec distributivité
interface Additive a => Multiplicative a => Semiring a where {}
Un type muni à la fois d'une addition et d'une multiplication, où la multiplication se distribue sur l'addition. Une interface marqueur (aucune nouvelle méthode).
EuclideanDiv — division entière et modulo
interface Semiring a => EuclideanDiv a where
div : a -> a -> a
mod : a -> a -> a
Division entière à sémantique euclidienne. Sur Semiring (pas Ring), donc Nat a aussi div/mod — les mêmes div/mod que Int. Le reste est toujours positif ou nul. div (-7) 3 = -3, mod (-7) 3 = 2 (pas -1 comme en C). Loi : div x y * y + mod x y = x
Ring — un semi-anneau avec soustraction
interface Semiring a => AdditiveGroup a => Ring a where {}
Un anneau : un semi-anneau qui est aussi un groupe additif. Interface marqueur. Nat n'est PAS un Ring (il n'a pas de negate).
CommutativeRing — multiplication commutative
interface Ring a => CommutativeRing a where {}
Un anneau dont la multiplication commute (a b == b a). Interface marqueur.
EuclideanRing — un anneau euclidien
interface CommutativeRing a => EuclideanDiv a => EuclideanRing a where {}
Un anneau commutatif avec division euclidienne. Interface marqueur (= CommutativeRing + EuclideanDiv). Nat n'en est pas un (pas de negate), bien qu'il ait quand même EuclideanDiv. Note : Double n'est volontairement PAS encore EuclideanDiv/EuclideanRing/Field — savoir si les div/mod de Double doivent être tronqués ou suivre la structure de corps triviale (div = /, mod = zero) reste ouvert.
DivisionRing — inverse et division réelle
interface Ring a => DivisionRing a where
recip : a -> a
(/) : a -> a -> a
Division réelle et inverse. Étend Ring. Pour les types continus (Double). Pas pour la division entière.
Fonctions en virgule flottante sur Double
pi : Double
π, en double précision.
interface Floating a where
sqrt : a -> a
exp : a -> a
ln : a -> a
sin : a -> a
cos : a -> a
tan : a -> a
Floating rassemble les FONCTIONS transcendantes. Double est la seule instance pour l'instant ; la CLASSE les rend génériques pour que d'autres types flottants (un futur flottant à précision arbitraire, …) puissent rejoindre. ln est indéfini pour les entrées non positives ; sin/cos/tan prennent des radians.