2015-05-27 12 views
13

Haskell fornisce una classe di tipi standard "Alternativa" che fornisce effettivamente l'operatore <|> per qualsiasi tipo che sia anche un Applicativo.Perché la classe alternativa di Alternativa deve essere una sottoclasse di Control.Applicativo

quanto ho capito alternativo è considerato un Monoide su applicativa di, tuttavia l'operatore <|> sembra avere un senso completo in un sacco di tipi che non sono Funtori applicativi pure, e ci non ha bisogno di essere qualsiasi dipendenza specifica sulla classe di caratteri Applicativa affinché funzioni correttamente.

Esiste un motivo per cui l'alternativa deve essere una sottoclasse di Applicativo e, in tal caso, esiste una classe standard per definire funzionalità simili su tipi non applicativi?

+2

'Monoid' sarebbe la classe per i tipi non applicativi. – Lee

+4

@Lee, che non è del tutto corretto, come 'Monoid' è una classe di tipi e' Alternative' è una classe di costruttori di tipi. Vorrei poter avere dei limiti localmente quantificati sui costruttori di tipi, come '(forall a. Monoid f a)' ma ciò non è permesso. – pigworker

+0

Tecnicamente l'alternativa è solo "Monoid for Applicatives", quindi "Monoid" sembrerebbe essere il caso più comune, poiché capisco che l'uso previsto dell'operatore '<|>' è "Pick or ore another", che è in qualche modo diverso da 'mconcat'? –

risposta

6

Penso che Alt dal pacchetto semigroupoids si avvicini ad essere un tipico tipo "standard". https://hackage.haskell.org/package/semigroupoids-5.0.0.1/docs/Data-Functor-Alt.html#t:Alt

+0

Sarebbe più bello se' Alt' fosse una superclasse di 'Alternative', e 'Applica' una superclasse di' Applicativo', non è vero? –

+0

E mi sembra di perdere un'istanza per lavorare con questo 'Alt' come un Semigruppo. (Analogamente a [il' Nuovo Alt'] (http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-Monoid.html#g:5) che rende possibile usare un 'Alternative' come mono.) –

Problemi correlati