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) 如果你还需要*通勤并且有反向,那么你就有了一个字段.