2014-11-22 10 views
5

Secondo la definizione o un monoide l'operatore binario deve essere associativo ad es. A op (B op C) == (A op B) op C.Haskell - Implementare Monoid cosa succede se l'operatore non è associativo

Il base mconcat definition in Haskell è:

mconcat = foldr mappend mempty 

Poiché conosco i dettagli di implementazione della funzione mconcat, sarebbe nulla di male accada da definire e utilizzare monoidi falsi in cui la funzione non è associativo? Come per esempio la definizione di istanze per sottrazione o divisione.

Potrebbe essere utile o mi manca il punto?

risposta

11

Nulla di male potrebbe accadere in termini di sicurezza del tipo: i programmi non si arresteranno ancora.

Ma una struttura dati che si basa sull'istanza Monoid potrebbe fornire risultati imprevisti o errati.

Considerare un albero che viene riequilibrato al momento dell'inserimento e che fornisce un modo per combinare i suoi elementi utilizzando l'istanza Monoid. Quindi il riequilibrio, che dovrebbe essere un'operazione interna e non visibile a voi diventa osservabile, e la trasparenza referenziale è "moralmente rotta" - stesso input (fino a interni presumibilmente nascosti), ma output differente.

+1

Direi che è peggio di andare in crash. Ma immagino che non ci sia modo di aggirarlo se qualcuno vuole insistere sul fatto che 'a- (b-c) == (a-b) -c' dovrebbe contenere ... –