Num类的haskell允许非常一般的代数结构,看起来它的目的是用来制作环。当谈到一个戒指时,能够明确地提到它的附加和乘法单位 - 也许是Num.Zero和Num.One - 很方便Num,这是另一个包括单位或其他方式的类,这是做什么?
答案 0 :(得分:16)
如果您的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
编辑:由于Z在Ring中是初始的,因此以这种方式使用fromInteger
的想法实际上很有意义。
答案 1 :(得分: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
。