首页 > 解决方案 > 这是一个好的幺半群动作吗?

问题描述

我想我可能偶然发现了一个通用的,尽管有些退化的幺半群动作。伪哈斯克尔:

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是设置nmempty除非m自身为空。

这是一个守法的幺半群动作吗?它以前是不是我以外的人发明的?如果有,它的名字是什么?

标签: haskellmonoids

解决方案


至少在一般情况下,它看起来不像是一个幺半群动作。如果是,我们应该具有以下属性:

-- 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

Takemnto be 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

导致两个不相容的结果。

另一方面,whenm是一个幺半群,其中没有(非平凡的)元素有逆,例如[a],那么你act看起来像一个正确的动作。


推荐阅读