这是一个好的幺半群动作吗?
Is this a good monoid action?
我想我可能偶然发现了一个将军,尽管有点堕落,monoid action。伪Haskell:
instance (Monoid m, Monoid n) => Act m n where
act mempty x = x -- let's pretend that we can use `mempty` as a pattern
act _ _ = mempty
m
对 n
的操作是将 n
设置为 mempty
,除非 m
本身为空。
这是一个守法的幺半群动作吗?它以前是由我以外的人发明的吗?如果有,它叫什么名字?
它看起来不像一个幺半群动作,至少在一般情况下是这样。如果是,我们应该具有以下属性:
-- law 1
act mempty x = x
-- law 2
act (m1 <> m2) x = act m1 (act m2 x)
并且,由于在伪实例中定义了 act
的方式:
-- property 1
act x y = mempty
when x /= mempty
取m
和n
为Sum Int
,是一个幺半群
我们有
act (Sum 0) (Sum 1)
= { definition of mempty }
act mempty (Sum 1)
= { law 1 }
Sum 1
我们还有
act (Sum 0) (Sum 1)
= { definition of <> on Sum }
act (Sum (-2) <> Sum 2) (Sum 1)
= { law 2 }
act (Sum (-2)) (act (Sum 2) (Sum 1))
= { property 1, given Sum (-2) /= mempty }
mempty
= { definition of mempty }
Sum 0
导致两个不兼容的结果。
另一方面,当 m
是一个幺半群时,其中没有(非平凡的)元素具有逆元素,例如[a]
,那么你的 act
看起来是一个正确的动作。
我想我可能偶然发现了一个将军,尽管有点堕落,monoid action。伪Haskell:
instance (Monoid m, Monoid n) => Act m n where
act mempty x = x -- let's pretend that we can use `mempty` as a pattern
act _ _ = mempty
m
对 n
的操作是将 n
设置为 mempty
,除非 m
本身为空。
这是一个守法的幺半群动作吗?它以前是由我以外的人发明的吗?如果有,它叫什么名字?
它看起来不像一个幺半群动作,至少在一般情况下是这样。如果是,我们应该具有以下属性:
-- law 1
act mempty x = x
-- law 2
act (m1 <> m2) x = act m1 (act m2 x)
并且,由于在伪实例中定义了 act
的方式:
-- property 1
act x y = mempty
when x /= mempty
取m
和n
为Sum Int
,是一个幺半群
我们有
act (Sum 0) (Sum 1)
= { definition of mempty }
act mempty (Sum 1)
= { law 1 }
Sum 1
我们还有
act (Sum 0) (Sum 1)
= { definition of <> on Sum }
act (Sum (-2) <> Sum 2) (Sum 1)
= { law 2 }
act (Sum (-2)) (act (Sum 2) (Sum 1))
= { property 1, given Sum (-2) /= mempty }
mempty
= { definition of mempty }
Sum 0
导致两个不兼容的结果。
另一方面,当 m
是一个幺半群时,其中没有(非平凡的)元素具有逆元素,例如[a]
,那么你的 act
看起来是一个正确的动作。