scalabook
Signed
Формальное определение
Общее упорядочивание, инвариантное к сдвигу, фиксируется классом типов Signed[A]
,
который расширяет Order
, - типы, имеющие знак (отрицательный, ноль, положительный).
В общем случае тип A
содержит нулевой элемент 0
.
Signed
должен удовлетворять следующим законам (помимо законов Order
и Equal
):
signum(x) = -1
еслиx < 0
,signum(x) = 1
еслиx > 0
, иначе -signum(x) = 0
.
Если тип A
оснащен отрицательными элементами -x
, то:
abs(x) = -x
еслиx < 0
, иначе -x
,
Определение в виде кода на Scala
trait Equal[A]: def equal(a1: A, a2: A): Boolean
enum Ordering: case LT case EQ case GT
trait Order[A] extends Equal[A]: def order(x: A, y: A): Ordering
enum Sign: case Positive case Zero case Negative
trait Signed[A] extends Order[A]: def sign(x: A): Sign def isSignPositive(x: A): Boolean = sign(x) == Sign.Positive def isSignZero(x: A): Boolean = sign(x) == Sign.Zero def isSignNegative(x: A): Boolean = sign(x) == Sign.Negative def isSignNonPositive(x: A): Boolean = sign(x) != Sign.Positive def isSignNonZero(x: A): Boolean = sign(x) != Sign.Zero def isSignNonNegative(x: A): Boolean = sign(x) != Sign.Negative
Реализация
Реализация в Spire
import spire.algebra.Signed.*import spire.std.int.*
sign(10) // Positivesign(0) // Zerosign(-10) // Negativesignum(10) // 1signum(0) // 0signum(-10) // -1abs(10) // 10abs(0) // 0 abs(-10) // 10isSignPositive(10) // trueisSignZero(0) // trueisSignNegative(-10) // trueisSignNonPositive(10) // falseisSignNonZero(0) // falseisSignNonNegative(-10) // false
Ссылки: