2013-07-01 7 views
7

Es erschien mir nur, dass es keine Möglichkeit gibt, einen einzelnen Wert in ein Monoid in Data.Monoid zu injizieren. Ich zögere, Data.Monad.return dafür zu verwenden, aber ich hoffte, etwas wie singleton für verschiedene Arten zu finden.Wie wird ein Wert in ein Monoid injiziert?

+5

Ein 'Monoid' ist nur ein Typ mit einer' Monoid'-Instanz, es ist kein Container (in der Regel) in den Sie Werte injizieren. Zum Beispiel gibt es eine 'Instance Monoid Ordering', und dafür haben Sie die drei (nicht unteren) Werte' LT', 'EQ',' GT', es gibt nichts zu injizieren, schreiben Sie einfach den Wert. –

+2

Welchen Typ hätte es? 'Singleton :: Monoid m => a -> ???' –

+0

@AlexeyRomanov 'Singleton x = mempty' :) (sehr nützlich) –

Antwort

15

Die Klasse Monoid erlaubt keine Injektion, da das Monoid keine Art von Behälter ist. Einige Behälter sind Monoide, und dann haben sie ihre eigenen Mittel zur Injektion. Für eine relativ allgemeine Injektion können Sie pure von Applicative oder return von Monad verwenden (ersteres ist allgemeiner).

+0

Hmm ... also ... gibt es eine theoretische geerdete Klasse, die' Container umschließt '? – fho

+12

@Florian: Typ Konstruktoren mit dieser "inject" -Operation, aber nicht unbedingt 'Applicative', eine aufgerufene [' Pointed'] (http://hackage.haskell.org/packages/archive/pointed/3.0.3/doc/ html/Data-Pointed.html). – leftaroundabout

6

Hinzufügen zu dem, was andere gesagt haben: Int bildet ein Monoid (auf verschiedene Arten). Wie würden Sie einen Wert in Int "injizieren"? Nun, du tust es nicht; ein Int ist nur ein Int. Du könntest vielleicht Null oder etwas verwenden ...? Wenn nun etwas ein Container ist, bildet es ein Monoid. Aber das Monoid-Bit hilft Ihnen nicht, es als einen Behälter zu behandeln; Sie müssen etwas anderes dafür versuchen. Viele Dinge, die keine Container sind, bilden Monoide.

Verwandte Themen