2013-07-01 15 views
7

Mi è appena venuto in mente che non c'è modo di iniettare un singolo valore in un Monoid in Data.Monoid. Ho esitato a utilizzare Data.Monad.return per questo, ma speravo di trovare qualcosa come singleton per diversi tipi.Come iniettare un valore in un Monoid?

+5

Un 'Monoid' è solo un tipo con un'istanza' Monoid', non è un contenitore (in generale) in cui vengono iniettati valori. Per esempio c'è un 'Ordine monoordinato istanza', e per questo hai i tre valori (non in basso)' LT', 'EQ',' GT', non c'è nulla da iniettare, basta scrivere il valore. –

+2

Che tipo avrebbe? 'singleton :: Monoid m => a -> ???' –

+0

@AlexeyRomanov 'singleton x = mempty' :) (molto utile) –

risposta

15

La classe Monoid non consente alcun tipo di iniezione poiché il monoide non è un tipo di contenitore. Alcuni contenitori sono monoidi e quindi avranno i propri mezzi per l'iniezione. Per un'iniezione relativamente generale, è possibile utilizzare pure da Applicative o return da Monad (il primo è più generale).

+0

Hmm ... quindi ... c'è una classe teorica che racchiude i' Containers '? – fho

+12

@Florian: costruttori di tipi che hanno questa operazione "inject", ma non necessariamente 'Applicative', un chiamato [' Pointed'] (http://hackage.haskell.org/packages/archive/pointed/3.0.3/doc/ html/dati-Pointed.html). – leftaroundabout

6

In aggiunta a ciò che altri hanno detto: Int forma un monoid (in diversi modi). Come si "inietterebbe" un valore in Int? Bene, non lo fai; un Int è solo un Int. Potresti forse usare zero o qualcosa ...?

Ora, se qualcosa di è un contenitore, forma un monoide. Ma il bit monoide non ti aiuta a trattarlo come un contenitore; devi provare qualcos'altro per quello. Un sacco di cose che non sono contenitori formano monoidi.

Problemi correlati