some
e many
possono essere definiti come:
some f = (:) <$> f <*> many f
many f = some f <|> pure []
Forse aiuta a vedere come some
sarebbe da scrivere con monadica do
sintassi:
some f = do
x <- f
xs <- many f
return (x:xs)
Così some f
piste f
una volta, poi "molti "volte, e ne consegue i risultati. many f
corre f
"alcune" volte, o "in alternativa" restituisce semplicemente la lista vuota. L'idea è che entrambi eseguono f
il più spesso possibile finché non "fallisce", raccogliendo i risultati in un elenco. La differenza è che some f
non riesce se f
non riesce immediatamente, mentre many f
riuscirà e "restituirà" la lista vuota. Ma ciò che questo significa esattamente dipende da come è definito <|>
.
È utile solo per l'analisi? Vediamo cosa fa per le istanze in base: Maybe
, []
e STM
.
Primo Maybe
. Nothing
significa fallimento, in modo some Nothing
riesce così e valuta per Nothing
mentre many Nothing
riesce e viene valutato come Just []
. Entrambi some (Just())
e many (Just())
non restituiscono mai, perché Just()
non fallisce mai! In un certo senso, valutano a Just (repeat())
.
Per le liste, []
significa fallimento, così some []
viene valutato come []
(nessuna risposta), mentre many []
viene valutata a [[]]
(c'è una risposta ed è la lista vuota). Ancora some [()]
e many [()]
non tornare. Espandere le istanze, significa fmap (():) (many [()])
e many [()]
significa some [()] ++ [[]]
, quindi è possibile affermare che many [()]
corrisponde a tails (repeat())
.
Per STM
, il fallimento significa che l'operazione deve essere ripetuta. Quindi some retry
si riproverà da solo, mentre many retry
restituirà semplicemente la lista vuota. some f
e many f
eseguiranno ripetutamente lo f
fino a quando non riproverà. Non sono sicuro che questa sia una cosa utile, ma suppongo che non lo sia.
Così, per Maybe
, []
e STM
many
e some
non sembrano essere così utile.È utile solo se l'applicativo ha un qualche tipo di stato che rende il fallimento sempre più probabile quando si esegue la stessa cosa più e più volte. Per i parser questo è l'input che si sta riducendo a ogni corrispondenza riuscita.
@Landei: Ho letto la risposta in quel thread e ancora non capisco. – missingfaktor
Ho appena detto che questa domanda è un duplicato, non che l'originale avesse una buona risposta :-) Anche se è stato abbastanza buono per me: ho capito che queste funzioni sono molto probabilmente non interessanti per me ... – Landei
@Landei: Sto raggiungendo la stessa conclusione di te. :-) – missingfaktor