Klasa Num z haskell pozwala na dość ogólne struktury algebraiczne i wygląda na to, że ma służyć do tworzenia pierścieni. Mówiąc o pierścieniu, wygodnie jest móc wyraźnie wymienić jego dodatkowe i multiplikatywne jednostki - być może Num.Zero i Num.One - czy istnieje coś takiego dla Num, innej klasy, która zawiera jednostki lub w inny sposób, że jest to Gotowe?jednostki dla pierścieni w haskell w Num lub Rational
Odpowiedz
Jeśli instancja Num
jest pierścień, oczekuje fromInteger
będzie homomorfizmem pierścienia, a zatem 0
i 1
będzie po prostu działać. To nie zawsze może się utrzymywać. Num
poprzedza typeclasses posiadające prawa algebraiczne być normą. Ponadto, niestety, wiele przypadków Num
nie jest dzwonków (takich jak liczby zmiennoprzecinkowe).
Num
nie jest to struktura pierścienia, ponieważ ma również „inne rzeczy” jak abs
, signum
a (mam nadzieję) homomorfizmem pierścienia fromInteger
. Mam tendencję do myślenia o tym jako "pewnie z pewnymi innymi rzeczami".
Przykład: pierścień Gaussian rationals
import Data.Ratio
import Data.Complex
type GaussianRational = Complex Rational
zero :: GaussianRational
zero = 0
one :: GaussianRational
one = 1
EDIT: Ponieważ Z jest w początkowej Pierścienia, pomysł wykorzystania fromInteger
ten sposób rzeczywiście sprawia, że wiele sensu.
Cały pakiet algebra
jest poświęcony tego rodzaju celom. Na przykład, mamy
class (Rig r, Rng r) => Ring r
oraz towarzyszącą mu rzucić
class (Semiring r, Unital r, Monoidal r) => Rig r
class (Group r, Semiring r) => Rng r
class Multiplicative r => Unital r
class (Additive r, Abelian r, Multiplicative r) => Semiring r
class (LeftModule Integer r, RightModule Integer r, Monoidal r) => Group r
class (LeftModule Natural m, RightModule Natural m) => Monoidal m
class (Semiring r, Additive m) => RightModule r m
class (Semiring r, Additive m) => LeftModule r m
class Multiplicative r
class Additive r
class Additive r => Abelian r
który jest co najmniej jeden sposób, aby zbudować pierścień. Jeśli robisz wysoce ogólną algebrę, to może być warta algebra
, ale większość bibliotek oczekuje po prostu Num
.
To dobra sugestia! - tak długo, jak długo dba się o to, aby zlineut 0 powrócił zero, a od Integer 1 zwraca 1, to będzie działało dobrze! – simonize
@simonize Literał numeryczny '1' jest już' fromIntegral 1'. – AndrewC