簡體   English   中英

這種幺半群法的名稱是什么?

[英]What is the name of this monoid law?

Data.Monoid的文檔中,它聲明應滿足以下法律:

mappend mempty x = x
mappend x mempty = x
mappend x (mappend y z) = mappend (mappend x y) z
mconcat = foldr mappend mempty

我對這些的理解是前兩個是同一性,第三個是相關性。

但是第四行的法律是什么? 身份再次,但對於mconcat

在數學上,幺半群的定義需要存在像mempty這樣的東西,比如mappend ,滿足前三個定律:左右同一性和相關性。

mconcat方法已經被添加到類中以反映這樣的事實:列表中的累積通常是使用幺半群的方式。 第四個定律是mconcat可執行規范 :實際上,非常規則是提供mconcat默認實現的代碼行。 使mconcat成為類的成員意味着,根據Monoid實例,只要它與默認值一致,就可以自由地為mconcat提供更有效的實現。

我不清楚以這種方式重新實現mconcat是一個特別大的勝利。 我傾向於避免mconcat支持(令人困惑的名字) fold

mconcat的目的不是提供有關monoid的更多信息; 這是一個實現細節。 它是一個便利功能,但可以比默認定義更有效地實現。 當考慮無限列表時,“更有效”可能意味着“可能”。

考慮Product幺半群。 以下永遠不會終止,使用mconcat的默認定義:

mconcat (map Product [0..])

即使很明顯, 任何包含0的整數列表都應該產生0.但是,如果要將函數重新定義為

mconcat = foldr (\acc v -> if acc == Product 0 then Product 0 else mappend acc v) empty

然后,包含至少一個零的無限列表的乘積仍將終止。 (當然,無限值的非零值列表仍然永遠不會終止,但對於包含“早期”零的大型列表,此mconcat仍然更有效。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM