2014-05-21 9 views
5

Come nel titolo:alias Perché in Haskell `mappend` è` <> `invece di` `+

Perché in Haskell, mappend (dalla classe Monoid) Alias ​​è <> invece di +?

[modifica - ha aggiunto la motivazione] Nei corsi di algebra + viene solitamente utilizzato per monoid binario operatore.

+0

xmonad utilizza ['<+>'] (http://xmonad.org/xmonad-docs/xmonad/XMonad-ManageHook.html#v:-60--43--62-) per 'mappend'; IIRC è stato introdotto prima che '<>' sia stato aggiunto alle librerie standard. – raymonad

risposta

12

La funzione + è specifica per i numeri e inoltre è solo un modo per implementare Monoid per i numeri (* è ugualmente valido). Allo stesso modo, con i booleani, sarebbe ugualmente valido usare && e ||. Utilizzando il simbolo + si suggerisce che i mono sono circa in aggiunta in particolare, quando in realtà si tratta di qualsiasi operazione associativa .

E 'vero che, almeno nella mia esperienza, uno è probabile che l'uso mappend in un modo che assomiglia più: concatenazione di liste o vettori, prendendo le unioni di set o mappe, ecc, ecc, tuttavia, la mentalità Haskell favorisce generalità e l'aderenza ai principi matematici su (probabilmente) ciò che è più intuitivo. È certamente ragionevole, a mio parere, per pensare a di mappend come una sorta di aggiunta generale e apportare modifiche nei casi in cui non lo è.

+0

Questa è anche una buona ragione IMO. Non l'ho menzionato solo perché non è raro vedere persone che suggeriscono che '++' dovrebbe essere usato come un alias (es. [Classy-prelude] (http://hackage.haskell.org/package/classy-prelude -0.9.2/docs/ClassyPrelude.html)). – duplode

+0

Sono d'accordo anche con Boolean, '*' e '+' non sono simmetrici. '+' è un gruppo in cui '*' non lo è (fino a 0 remoto). Pertanto, '+' è in qualche modo * superiore * a '*' e non equivalente. IMHO avrebbe senso utilizzarlo come default monoid per 'Num' – mb14

Problemi correlati