2013-05-20 7 views
10

Die Num-Klasse von Haskell ermöglicht ganz allgemeine algebraische Strukturen und sieht aus wie es für die Herstellung von Ringen verwendet werden soll. Wenn man jedoch von einem Ring spricht, ist es bequem, seine zusätzlichen und multiplikativen Einheiten explizit nennen zu können - vielleicht Num.Zero und Num.One - gibt es so etwas für Num, eine andere Klasse, die Einheiten oder eine andere Weise enthält erledigt?Einheiten für Ringe in Haskell in Num oder Rational

Antwort

16

Wenn Ihre Instanz von Num ein Ring ist, erwartet man fromInteger ein Ringhomomorphismus zu sein und somit 0 und 1 wird funktionieren. Dies kann nicht immer halten. Num predates typeclasses mit algebraischen Gesetzen die Norm sein. Unglücklicherweise sind viele Instanzen von Num keine Ringe (wie Gleitkommazahlen).

Num ist nicht wirklich eine Ringstruktur, da es auch „andere Sachen“ wie abs, signum und der (hoffentlich) Ringhomomorphismus fromInteger. Ich neige dazu, es als "wahrscheinlich mit anderen Sachen ringend" zu denken.

Beispiel: der Ring von Gaussian rationals

import Data.Ratio 
import Data.Complex 

type GaussianRational = Complex Rational 

zero :: GaussianRational 
zero = 0 

one :: GaussianRational 
one = 1 

EDIT: Da Z Anfangs in Ring ist, die Idee fromInteger auf diese Weise tatsächlich macht sehr viel Sinn zu verwenden.

+0

das ist ein guter Vorschlag! - Solange man darauf achtet, dass fromInteger 0 die Null zurückgibt und fromInteger 1 eine 1 zurückgibt, wird es gut funktionieren! – simonize

+3

@simonize Das numerische Literal '1' ist bereits' fromIntegral1'. – AndrewC

4

Das gesamte Paket ist diesen Zwecken gewidmet. Zum Beispiel haben wir

class (Rig r, Rng r) => Ring r 

und Unterstützung der

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 

gegossen, die zumindest eine Art und Weise ist ein Ring aufzubauen. Wenn Sie sehr allgemeine Algebra tun, dann algebra könnte es wert sein, aber die meisten Bibliotheken erwarten nur Num.