10

Haskell 的 Num 类允许非常通用的代数结构,并且看起来它旨在用于制作环。不过,当谈到环时,能够明确提及它的附加和乘法单位(可能是 Num.Zero 和 Num.One)很方便,Num 是否存在这样的东西,另一个包含单位的类或其他方式完毕?

4

2 回答 2

17

如果您的实例Num是一个环,那么人们期望fromInteger它是一个环同态,因此0并且1会正常工作。这可能并不总是成立。 Num早于具有代数定律的类型类成为规范。此外,不幸的是,许多Num不是环的实例(例如浮点数)。

Num不是真正的环结构,因为它也有“其他东西”,比如abssignum和(希望)环同态fromInteger。我倾向于将其视为“可能与其他一些东西混在一起”。

示例:高斯有理数环

import Data.Ratio
import Data.Complex

type GaussianRational = Complex Rational

zero :: GaussianRational 
zero = 0

one :: GaussianRational
one = 1

编辑:由于 Z 在 Ring 中是初始的,因此使用fromInteger这种方式的想法实际上很有意义。

于 2013-05-20T19:52:30.643 回答
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.

于 2013-05-20T22:12:24.883 回答