幺半群和戒指之间差异的含义是什么?

haw*_*eye 3 haskell clojure monoids

这是Haskell中monoid的一个例子:

> import Data.Monoid
> Sum 5 <> Sum 6 <> Sum 10
Sum {getSum = 21}
> mconcat [Sum 5, Sum 6, Sum 10]
Sum {getSum = 21}
> getSum $ mconcat $ map Sum [5, 6, 10]
21
> getProduct $ mconcat $ map Product [5, 6, 10]
300
Run Code Online (Sandbox Code Playgroud)

这是Clojure中monoid的一个例子:

(defn plus-monoid
    ([]
        0)
    ([a b]
        (+ a b)))

(plus-monoid) 

(plus-monoid 3 4)

(reduce plus-monoid [2 3 4]) 
Run Code Online (Sandbox Code Playgroud)

这是Haskell中一个环的一个例子:

module Rings where

newtype Matrix r = M [[r]] deriving (Eq,Show)

instance Num r => Num (Matrix r) where
   M [[a,b],[c,d]] + M [[a',b'],[c',d']] = M [[a+a',b+b'],[c+c',d+d']]
   negate (M [[a,b],[c,d]]) = M [[-a,-b],[-c,-d]]
   M [[a,b],[c,d]] * M [[e,f],[g,h]] = M [[a*e+b*g, a*f+b*h] ,[c*e+d*g, c*f+d*h]]
   fromInteger n = M [[fromInteger n, 0],[0, fromInteger n]]

> M [[1,2],[3,4]] - M [[1,0],[0,1]]
M [[0,2],[3,3]]
> M [[2,0],[0,3]] * M [[1,2],[3,4]]
M [[2,4],[9,12]]
Run Code Online (Sandbox Code Playgroud)

这是Clojure中基于此的一个环的示例:

(defprotocol ring
  (plus [x y])
  (mult [x y])
  (neg [x])
  (zero [])
  (one []) )
Run Code Online (Sandbox Code Playgroud)

它似乎是 - (借用Java的说法),环和幺半群之间区别在于环具有"实现接口的附加方法".(也许我错了).现在对我而言,这会对相关性产生影响 - 但我并没有全神贯注于这一点.

我的问题是:幺半群和戒指之间的差异有什么影响?

A. *_*ebb 10

其他方法是必要的但不足以制作戒指.环结构由管理方法行为及其相互作用的规则产生.

例如,您可以实例Monad并实现bind并返回,公然无视Monad定律,只要您获得正确的类型,Haskell的类型检查器就会很高兴.称这是一个单子不它像一个单子应该不过.

戒指也是如此.

特别是,如果你调用一个环的合同法+ plus,- neg,* mul,0 zero,1 one

  • +, 0并且*, 1应该遵守幺半群法则.
  • -应该提供逆下+,即-a + a = 0
  • + 应该通勤,即 a + b = b + a
  • *应该分配+,即
    a * (b + c) = (a * b) + (a * c) (b + c) * a = (b * a) + (c * a)

如果你还需要*通勤并且有反向,那么你就有了一个字段.