In der Dokumentation für Data.Monoid
heißt es, dass die folgenden Gesetze erfüllt sein sollten:
Mein Verständnis davon ist, dass die ersten zwei Identität sind und die dritte Assoziativität.
Aber was ist das Gesetz in der vierten Zeile? Identität wieder, aber für mconcat
?
Mathematisch erfordert die Definition eines Monoids die Existenz von etwas wie mempty
und etwas wie mappend
, was die ersten drei Gesetze erfüllt: linke und rechte Identität und Assoziativität.
Die Methode mconcat
wurde der Klasse hinzugefügt, um die Tatsache widerzuspiegeln, dass die Häufung in einer Liste häufig mit der von Monoiden geschieht. Das vierte Gesetz ist die ausführbare Spezifikation von mconcat
: In der Tat ist genau dieses Gesetz die Codezeile, die die Standardimplementierung von mconcat
angibt. Wenn Sie mconcat
zu einem Mitglied der Klasse machen, können Sie pro Monoid
-Instanz mconcat
eine effizientere Implementierung geben, solange sie mit der Vorgabe übereinstimmt.
Es ist mir nicht klar, dass es ein besonders großer Gewinn ist, mconcat
auf diese Weise neu zu implementieren. Ich würde tendenziell mconcat
zugunsten (der verwirrend benannte) fold
vermeiden.
Der Zweck von mconcat
besteht nicht darin, weitere Informationen über das Monoid bereitzustellen; Es ist ein Implementierungsdetail. Es ist eine Komfortfunktion, die jedoch effizienter implementiert werden kann als ihre Standarddefinition. Wenn unendliche Listen betrachtet werden, kann "effizienter" "möglich" bedeuten.
Betrachten Sie das Product
-Monoid. Folgendes wird nie mit der Standarddefinition von mconcat
:
, obwohl es offensichtlich sein sollte, dass any Liste von ganzen Zahlen, die 0 enthalten, 0 ergeben sollte. Wenn Sie jedoch die Funktion als
neu definieren würden %Vor% Dann würde das Produkt einer unendlichen Liste, die mindestens eine Null enthält, immer noch enden. (Natürlich würde eine unendliche Liste von Nicht-Null-Werten immer noch nicht enden, aber diese mconcat
ist immer noch effizienter für große Listen, die eine "frühe" Null enthalten.)
Tags und Links haskell