2011-10-06 12 views
15

Duplicar posibles:
Haskell: some and many
Haskell - What is Control.Applicative.Alternative good for?Funciones de la clase de tipo 'Alternativa'

¿Cuáles son las funciones y somemany en la clase Alternative tipo útil para? Docs proporciona una definición recursiva que no pude comprender.

+0

@Landei: Leí la respuesta en ese hilo, y todavía no lo entiendo. – missingfaktor

+0

Acabo de decir que esta pregunta es un duplicado, no es que la original tenía una buena respuesta :-) Aunque fue lo suficientemente bueno para mí: me di cuenta de que estas funciones probablemente no me interesen ... – Landei

+0

@Landei: Estoy llegando a la misma conclusión que tú. :-) – missingfaktor

Respuesta

33

some y many se puede definir como:

some f = (:) <$> f <*> many f 
many f = some f <|> pure [] 

Tal vez ayuda a ver cómo some se escribiría con monádico do sintaxis:

some f = do 
    x <- f 
    xs <- many f 
    return (x:xs) 

Así some f carreras f una vez, a continuación, "muchos "veces, y considera los resultados. many f ejecuta f "algunas" veces, o "alternativamente" simplemente devuelve la lista vacía. La idea es que ambos ejecuten f tan a menudo como sea posible hasta que "falle", recopilando los resultados en una lista. La diferencia es que some f falla si f falla inmediatamente, mientras que many f tendrá éxito y "devolverá" la lista vacía. Pero lo que esto significa exactamente depende de cómo se define <|>.

¿Es solo útil para el análisis sintáctico? Veamos qué hace para las instancias en la base: Maybe, [] y STM.

Primero Maybe. Nothing significa falla, por lo que some Nothing también falla y se evalúa como Nothing, mientras que many Nothing tiene éxito y se evalúa como Just []. ¡Tanto some (Just()) como many (Just()) nunca regresan, porque Just() nunca falla! En cierto sentido, evalúan a Just (repeat()).

Para listas, [] significa el fracaso, por lo que se evalúa como some [][] (sin respuestas), mientras que many [] evalúa a [[]] (hay una respuesta y es la lista vacía). De nuevo some [()] y many [()] no devuelven. La ampliación de las instancias, some [()] significa fmap (():) (many [()]) y many [()] significa some [()] ++ [[]], por lo que podría decirse que many [()] es lo mismo que tails (repeat()).

Para STM, la falla significa que la transacción debe ser reintegrada. Por lo tanto, some retry volverá a intentarlo, mientras que many retry simplemente devolverá la lista vacía. some f y many f ejecutará f repetidamente hasta que vuelva a intentarlo. No estoy seguro de si esto es útil, pero supongo que no.

Así, por Maybe, [] y STMmany y some no parecen ser tan útil.Solo es útil si el aplicativo tiene algún tipo de estado que hace que la falla sea cada vez más probable cuando se ejecuta la misma operación una y otra vez. Para los analizadores esta es la entrada que se reduce con cada coincidencia exitosa.

8

E.g. para parsing (consulte la sección "Análisis aplicativo por ejemplo").

+2

No estoy familiarizado con Parsec. Apreciaría alguna explicación. – missingfaktor

+2

Por lo que entiendo, si tiene un analizador 'p' para X, entonces' alguna p' es un analizador sintáctico para 0 o más X y 'muchos p' es un analizador sintáctico para 1 o más X. – Ingo

+2

@missingfaktor' algunos 'y' many' se implementan en términos de '<|>'. Este combinador es útil también de otras maneras. Considere 'O'':' Solo 0 <|> Solo 1 = Solo 0', 'Nada <|> Solo 2 = Solo 2',' Solo 3 <|> Nada = Solo 3', 'Nada <|> Nada = Nada' – fuz

Cuestiones relacionadas