2013-05-20 2 views
10

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

ответ

16

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

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

Пример: кольцо Gaussian rationals

import Data.Ratio 
import Data.Complex 

type GaussianRational = Complex Rational 

zero :: GaussianRational 
zero = 0 

one :: GaussianRational 
one = 1 

EDIT: Так как Z является начальным в кольце, идея использования fromInteger таким образом, фактически делает много смысла.

+0

это хорошее предложение! - до тех пор, пока кто-то позаботится сделать fromInteger 0 вернуть ноль, а fromInteger 1 вернуть 1, он будет работать просто отлично! – simonize

+3

@simonize Числовой литерал '1' уже' fromIntegral 1'. – AndrewC

4

Весь пакет 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.

Смежные вопросы