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
, xs
i ewentualnie f
. Istnieją 4 przeciążenia Γ
, z których każdy działa nieco inaczej.
list
Pierwsze przeciążenie list
przyjmuje wartość a
i funkcję binarną f
. Zwraca nową funkcję, która pobiera listę, zwraca, a
jeśli jest pusta, i wywołuje f
głowę i ogon , jeśli nie jest pusta . Na przykład Γ_1€
pobiera listę, zwraca, -1
jeśli jest pusta, a indeks pierwszego wystąpienia pierwszego elementu w ogonie, jeśli nie.
listN
Drugie przeciążenie, listN
jest podobne do list
, z tą różnicą, że a
jest 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 listN
jest 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ść a
i funkcję f
i zwraca nową funkcję, g
która pobiera listę. Jednak ten czas f
wymaga dodatkowego argumentu funkcji, który g
sam 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 listF
implementuje ogólny schemat rekurencji na listach.
listF
nie jest używane bardzo często, ponieważ wyraźna rekurencja z list
/ listN
ma zwykle taką samą długość lub krótszą, jak w tej odpowiedzi .
listNF
listNF
jest do listF
tego, co listN
jest list
: dane wejściowe a
są 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 f
jest jawną lambda λ·:o⁰↔
, której argumentem ⁰
jest cała funkcja. Za pomocą f
tego 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.