[英]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.