2011-08-26 23 views
28

Estaba viendo la clase Applicative dentro de las bibliotecas de Haskell y tropecé con Alternative.Haskell - ¿Qué es Control.Applicative.Alternative good for?

¿Para qué sirve esta clase? Una búsqueda en google no reveló nada particularmente perspicaz. Y parece estar completamente fuera de lugar, incluido como está con el paquete Aplicativo.

¿Podría alguien publicar un posible escenario en el que utilizaría esta clase?

Respuesta

22

Se usa comúnmente con los analizadores de analizadores. Por ejemplo, si space es un combinador de analizador que coincide con un solo carácter de espacio en blanco, many space sería uno que coincidiría con espacios en blanco consecutivos.

Sin embargo, estoy de acuerdo en que está un poco fuera de lugar en Control.Applicative.

+18

Sólo * * poco fuera de lugar - es un monoide en 'Applicative's, en el mismo patrón que' 'MonadPlus' y ArrowPlus', tanto de los cuales también comparten un módulo con la clase en la que están basados. Por consistencia, "debería" haber sido llamado "ApplicativePlus", pero ese es un nombre feo. –

+0

¡Está bien eso explica mucho! Aunque nombrar 'ApplicativePlus' a' Alternative' no es tan bueno ya que este último tiene connotaciones que limitan su alcance. –

+0

@C. A. McCann, desearía que convirtieras tu comentario en una respuesta para poder aceptarlo :) –

16

A veces el operador <|> es bastante útil:

foldl1 (<|>) [Nothing, Just 5, Just 3] 
-- Just 5 
+1

¡Ah, eso es interesante! En ese contexto, <|> es como el cortocircuito || operador en muchos idiomas imperativos. –

+3

También puede hacerlo usando 'mconcat' con [el' Primer 'monoide] (http://haskell.org/ghc/docs/latest/html/libraries/base/Data-Monoid. html # t: Primero). Esto se generaliza muy bien a [los otros monoidios 'Maybe'] (http://byorgey.wordpress.com/2011/04/18/monoids-for-maybe/). – hammar

+5

Oh, no, 'foldl1' se usó en algún lugar donde hay un valor predeterminado sensato (' foldl (<|>) Nothing'). ¿Qué harás cuando tu respuesta falle? : D – Rotsor