Wie heißt dieses Monoidgesetz?

8

In der Dokumentation für Data.Monoid heißt es, dass die folgenden Gesetze erfüllt sein sollten:

%Vor%

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 ?

    
kurzweil4 10.09.2016, 09:10
quelle

2 Antworten

12

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.

    
pigworker 10.09.2016, 09:32
quelle
3

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 :

beendet %Vor%

, 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.)

    
chepner 10.09.2016 14:28
quelle

Tags und Links