Ho ripreso l'apprendimento di Haskell, dopo una breve interruzione e attualmente sto cercando di capire meglio come funzionano le espressioni di ricorsione e lambda in Haskell.Esempio di funzione ricorsiva Haskell con foldr
In questo: YouTube video, c'è un esempio funzione che mi ha molto più di quanto probabilmente dovrebbe puzzle, in termini di come funziona realmente:
firstThat :: (a -> Bool) -> a -> [a] -> a
firstThat f = foldr (\x acc -> if f x then x else acc)
Per motivi di chiarezza e dato che non era immediatamente ovvio per me, ti darò un esempio di applicazione di questa funzione per alcuni argomenti:
firstThat (>10) 2000 [10,20,30,40] --returns 20, but would return 2000, if none of the values in the list were greater than 10
favore correggetemi, se le mie ipotesi sono sbagliate.
Sembra firstThat
prende tre argomenti:
- una funzione che prende un argomento e restituisce un valore booleano. Poiché l'operatore
>
è in realtà una funzione infisso, il primo argomento nell'esempio precedente sembra il risultato di un'applicazione parziale alla funzione>
: è corretta? - un valore specificato dello stesso tipo previsto come argomento mancante alla funzione fornita come primo argomento
- un elenco di valori del tipo suddetto
Ma la funzione effettiva firstThat
sembra essere definito in modo diverso dalla sua dichiarazione di tipo, con un solo argomento. Dal momento che lo foldr
accetta normalmente tre argomenti che ho raccolto, è in atto una sorta di applicazione parziale. L'espressione lambda fornita come argomento a foldr
sembra che manchi anche i suoi argomenti.
Quindi, come funziona esattamente questa funzione? Mi scuso se sono troppo denso o non riesco a vedere la foresta per gli alberi, ma non riesco a capirlo, il che è frustrante.
Qualsiasi utile spiegazione o esempio (s) sarebbe molto apprezzato.
Grazie!
Ci scusiamo per gli errori di battitura e grazie per la modifica, duplode! – odiumediae
A proposito, non c'è nulla di ricorsivo nel tuo 'firstThat' - solo perché' foldr' ti aiuta a riscrivere non ricorsivamente una funzione altrimenti ricorsiva, non significa che dovresti fare riferimento a qualsiasi funzione che usi 'foldr' come ricorsivo . –
Grazie, capisco cosa intendi e, naturalmente, ha senso. Ho molto più da imparare di quanto pensassi. – odiumediae