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 STM
many
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.
@Landei: Leí la respuesta en ese hilo, y todavía no lo entiendo. – missingfaktor
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
@Landei: Estoy llegando a la misma conclusión que tú. :-) – missingfaktor