这是一个好的幺半群作用吗?

5

我认为我可能发现了一个通用的、虽然有些退化的单子作用。伪 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

mn 的操作是将 n 设置为 mempty,除非 m 本身为空。

这是一个守法的幺半群操作吗?是否有其他人发明过此操作?如果有,它的名称是什么?


看起来这可能与湮灭元有关。 - Benjamin Hodgson
1个回答

5

在一般情况下,它似乎不是一个单子群作用。如果是,我们应该具备以下特性:

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

mn视为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看起来像是一个恰当的作用。


这很有道理,谢谢。我能对 m 应用哪些限制,以便我拥有一个幺半群作用呢?例如,如果 m 不是一个群?或者如果 mmappend 是单调的?(我可能用两种方式说了同样的事情。) - Benjamin Hodgson
@BenjaminHodgson,你需要的不仅仅是“不是一个群”。我猜你需要“没有除了mempty以外有逆元素的元素”。在这种情况下,它应该是一个操作,我猜想(?) - chi
非常有帮助,谢谢。你知道这个东西有名字吗? - Benjamin Hodgson
@BenjaminHodgson 我不知道。一个自由幺半群应该就足够了,但你不需要幺半群完全自由。例如,在列表上 x <> y = take 4 (x++y) 应该是可以的(?),即使它不形成一个自由幺半群。不确定是否有一个标准名称。 - chi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接