Usi di Γ
L'uso principale del built-in Γ, noto come pattern matching su elenchi o decostruzione di elenchi , è quello di dividere un elenco in testa e coda e applicare una funzione binaria su di essi. Ciò corrisponde al linguaggio di corrispondenza del modello di Haskell
f (x : xs) = <something>
f [] = <something else>
dove <something>è un'espressione contenente x, xse possibilmente f. Ci sono 4 sovraccarichi di Γ, ciascuno dei quali funziona in modo leggermente diverso.
list
Il primo sovraccarico,, listassume un valore ae una funzione binaria f. Restituisce una nuova funzione che accetta un elenco, restituisce ase è vuoto e chiama fin testa e in coda se è vuoto. Ad esempio, Γ_1€accetta un elenco, restituisce -1se è vuoto e in caso contrario l'indice di prima occorrenza del primo elemento nella coda.
listN
Il secondo sovraccarico, listNè simile a list, tranne che aviene omesso e al suo posto viene utilizzato il valore predefinito del tipo restituito. Ad esempio, Γ€è equivalente a Γ0€, poiché il valore numerico predefinito è 0.
In pratica, listNviene utilizzato più spesso di list, poiché il valore predefinito è irrilevante o esattamente ciò di cui hai bisogno. Un modello comune è Γ~αβγ, dove αβγsono tre funzioni; questo vale βper il primo elemento e γper la coda e combina i risultati con α. È stato utilizzato ad esempio in questa risposta . Altri modelli includono l' Γo:αapplicazione αsolo al primo elemento e l' Γ·:mαapplicazione αa tutti gli elementi tranne il primo. Quest'ultimo è stato utilizzato in questa risposta .
listF
Il terzo sovraccarico è un po 'più coinvolto. Ad esempio list, accetta un valore ae una funzione fe restituisce una nuova funzione gche accetta un elenco. Tuttavia, questa volta faccetta un argomento di funzione extra, che è esso gstesso, e può chiamarlo su qualsiasi valore (incluso, ma non limitato a, la coda dell'elenco di input). Ciò significa che listFimplementa uno schema di ricorsione generale negli elenchi.
listFnon viene usato molto spesso, poiché la ricorsione esplicita con list/ listNè solitamente della stessa lunghezza o più corta, come in questa risposta .
listNF
listNFè listFciò che listNè list: l'ingresso aè omesso e al suo posto viene utilizzato il valore predefinito del tipo restituito. In rare circostanze, può essere più breve di una piega a destra, ad esempio in questa risposta .
Come esempio delle versioni ricorsive di Γ, la funzione Γλ·:o⁰↔mescola un elenco nell'ordine primo, ultimo, secondo, penultimo, terzo, terzo penultimo e così via.
Provalo online!
La funzione fè la lambda esplicita λ·:o⁰↔, il cui argomento ⁰è l'intera funzione. Ciò che ffa è invertire la coda con ↔, quindi chiamare la funzione principale in modo ricorsivo con o⁰, e infine virare la testa indietro con ·:. Certo, Γ·:o₀↔è un byte più breve, ma non funziona se la linea contiene qualcosa di diverso da questa funzione.