2013-05-20 13 views
10

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

16

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.

+0

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

+3

@simonize Literał numeryczny '1' jest już' fromIntegral 1'. – AndrewC

4

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.

Powiązane problemy