Единицы для колец в haskell в Num или Rational

Класс Num haskell допускает вполне общие алгебраические структуры и выглядит так, как будто он предназначен для создания колец. Говоря о кольце, однако, удобно уметь четко указывать его дополнительные и мультипликативные единицы - возможно, Num.Zero и Num.One - есть ли такая вещь для Num, другого класса, который включает в себя единицы или какой-либо другой способ, которым это сделано?

Ответ 1

Если ваш экземпляр Num является кольцом, мы ожидаем, что fromInteger будет гомоморфизмом кольца и, следовательно, 0 и 1 будут работать. Это может не всегда выполняться. Num предшествующие классы, имеющие алгебраические законы, являются нормой. Кроме того, к сожалению, многие экземпляры Num не являются кольцами (например, номерами с плавающей запятой).

Num на самом деле не является кольцевой структурой, так как у нее также есть "другие вещи", такие как abs, signum и (надеюсь) кольцевой гомоморфизм fromInteger. Я склонен думать об этом как "вероятно, кольцо с каким-то другим".

Пример: кольцо гауссовские рациональности

import Data.Ratio
import Data.Complex

type GaussianRational = Complex Rational

zero :: GaussianRational 
zero = 0

one :: GaussianRational
one = 1

EDIT: Поскольку Z является исходным в Ring, идея использования fromInteger таким образом действительно имеет большой смысл.

Ответ 2

Весь этот пакет algebra посвящен этим целям. Например, мы имеем

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

и поддерживающий литье

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

который является по крайней мере одним способом создания кольца. Если вы делаете очень общую алгебру, тогда algebra может стоить того, но большинство библиотек просто ожидают Num.