2013-05-20 3 views
10

haskell의 Num 클래스는 매우 일반적인 대수 구조를 허용하며 링을 만드는 데 사용되는 것처럼 보입니다. 링을 말할 때, 아마도 Num.Zero와 Num.One 일 것입니다. Num과 같은 유닛이있을 것입니다. 유닛이나 다른 방법을 포함하는 또 다른 클래스입니다. 끝난? Num의 인스턴스가 링 인 경우Num 또는 Rational의 haskell 링에 대한 단위

답변

16

, 하나는 fromInteger는 링 이체 동형 수있어 01 바로 작동합니다 기대하고있다. 이것은 항상 유지되지 않을 수 있습니다. 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 

편집의 링 : Z는 링에서 초기이기 때문에, fromInteger를 사용하는 아이디어는이 방법은 실제로 많은 이해된다.

+0

좋은 제안입니다. - 하나가 fromInteger 0이 0을 반환하고, 1 Integer가 1을 반환하면 상관 없습니다. – simonize

+3

@imimize 숫자 리터럴 '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을 기대합니다.