Nel mondo procedurale, se devo trovare il primo elemento di un elenco che soddisfa un test, vorrei semplicemente utilizzare break
o return
.Come interrompere una funzione di riduzione dall'elaborare l'elenco una volta raggiunto l'accumulo desiderato?
In Clojure, quando sto elaborando un elenco utilizzando reduce
per trovare il primo valore, non sarà inefficiente se continuo ed elaboro l'intero elenco?
Ad esempio: convalida di un elenco di dizionari per errori; ogni dizionario ha una chiave chiamata count
. Ora la somma totale di questi campi di conteggio nell'elenco non deve superare un determinato valore. Come trovo il primo elemento nell'elenco in cui la somma supera il limite?
Idealmente, vorrei usare reduce
e mantenere un totale parziale; non appena il totale supera il limite, vorrei fermarmi qui (che non riesco a capire come fare).
Inoltre, il valore di ritorno della riduzione sarà la somma fino ad ora ogni volta ma avrei bisogno di restituire l'indice alla fine di tutto.
Oh wow! qualcosa di simile esiste ma ho bisogno di restituire la posizione in cui ciò accade altrimenti restituire -1. ma se l'indice di ritorno è ridotto, come accumulo la somma. Devo inserire entrambi i valori in una mappa o in un elenco? e restituirlo con entrambi i valori alla fine di ogni chiamata ridotta? –
Sì, è possibile aggiornare l'indice nell'accumulatore. Qualcosa di simile (fn [acc x] (if (> (: sum acc) 10) (acc ridotto) (assoc acc: idx (inc (: idx acc)): sum (+ (: sum acc) x))). – Jonas