2011-10-06 10 views
15

Eventuali duplicati:
Haskell: some and many
Haskell - What is Control.Applicative.Alternative good for?Funzioni di classe del tipo 'Alternativa'

Quali sono le funzioni some e many nella classe Alternative tipo utile per? Docs forniscono una definizione ricorsiva che non ero in grado di comprendere.

+0

@Landei: Ho letto la risposta in quel thread e ancora non capisco. – missingfaktor

+0

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

+0

@Landei: Sto raggiungendo la stessa conclusione di te. :-) – missingfaktor

risposta

33

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 STMmany 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.

8

E.g. per parsing (vedere la sezione "Analisi applicativa per esempio").

+2

Non ho familiarità con Parsec. Gradirei qualche spiegazione. – missingfaktor

+2

Per quanto ho capito, se si ha un parser 'p' per X, quindi' some p' è un parser per 0 o più X e 'many p' è un parser per 1 o più X. – Ingo

+2

@missingfaktor' alcuni 'e' many' sono implementati in termini di '<|>'. Questo combinatore è utile anche in altri modi. Consideriamo "O": 'Solo 0 = 0 solo 0',' Niente <|> Solo 2 = Solo 2', 'Solo 3 <|> Niente = Solo 3',' Niente <|> Niente = Niente' – fuz

Problemi correlati