Zastosowania Γ
Głównym zastosowaniem wbudowanego Γ, znanego jako dopasowanie wzorca do list lub dekonstrukcja listy , jest podzielenie listy na głowę i ogon i zastosowanie na nich funkcji binarnej. Odpowiada to idiomowi dopasowującemu wzór Haskella
f (x : xs) = <something>
f [] = <something else>
gdzie <something>jest ekspresyjny zawierający x, xsi ewentualnie f. Istnieją 4 przeciążenia Γ, z których każdy działa nieco inaczej.
list
Pierwsze przeciążenie listprzyjmuje wartość ai funkcję binarną f. Zwraca nową funkcję, która pobiera listę, zwraca, ajeśli jest pusta, i wywołuje fgłowę i ogon , jeśli nie jest pusta . Na przykład Γ_1€pobiera listę, zwraca, -1jeśli jest pusta, a indeks pierwszego wystąpienia pierwszego elementu w ogonie, jeśli nie.
listN
Drugie przeciążenie, listNjest podobne do list, z tą różnicą, że ajest pomijane i zamiast tego używana jest domyślna wartość typu zwracanego. Na przykład Γ€jest równoważne Γ0€, ponieważ domyślną wartością liczbową jest 0.
W praktyce listNjest używany częściej niż list, ponieważ wartość domyślna jest albo nieistotna, albo dokładnie to, czego potrzebujesz. Częstym wzorem jest Γ~αβγ, gdzie αβγsą trzy funkcje; dotyczy βto pierwszego elementu i γogona i łączy wyniki z α. Użyto go np. W tej odpowiedzi . Inne wzorce obejmują Γo:αzastosowanie αtylko do pierwszego elementu i Γ·:mαzastosowanie αdo wszystkich elementów oprócz pierwszego. To drugie zostało użyte w tej odpowiedzi .
listF
Trzecie przeciążenie jest nieco bardziej zaangażowane. Podobnie list, przyjmuje wartość ai funkcję fi zwraca nową funkcję, gktóra pobiera listę. Jednak ten czas fwymaga dodatkowego argumentu funkcji, który gsam w sobie, i może wywoływać go na dowolnej wartości (w tym między innymi na końcu listy wejściowej). Oznacza to, że listFimplementuje ogólny schemat rekurencji na listach.
listFnie jest używane bardzo często, ponieważ wyraźna rekurencja z list/ listNma zwykle taką samą długość lub krótszą, jak w tej odpowiedzi .
listNF
listNF jest do listF tego, co listNjest list: dane wejściowe asą pomijane, a zamiast nich używana jest domyślna wartość typu zwracanego. W rzadkich przypadkach może być krótszy niż prawy pas, na przykład w tej odpowiedzi .
Jako przykład rekurencyjnych wersji Γfunkcja Γλ·:o⁰↔przetasowuje listę w kolejności: pierwsza, ostatnia, druga, od drugiej do ostatniej, trzeciej, od trzeciej do ostatniej itd.
Wypróbuj online!
Funkcja fjest jawną lambda λ·:o⁰↔, której argumentem ⁰jest cała funkcja. Za pomocą ftego można odwrócić ogon ↔, a następnie wywołać rekurencyjnie główną funkcję o⁰, a na koniec odrzucić głowę do tyłu ·:. Oczywiście,Γ·:o₀↔ bajt jest krótszy, ale nie działa, jeśli wiersz zawiera coś innego niż ta funkcja.