Rachunek wzorcowy - Pattern calculus
Rachunek wzorców opiera wszystkie obliczenia na dopasowywaniu wzorców bardzo ogólnego rodzaju. Podobnie jak rachunek lambda , wspiera jednolite traktowanie oceny funkcji . Ponadto umożliwia przekazywanie funkcji jako argumenty i zwracanie ich jako wyników. Ponadto rachunek wzorcowy zapewnia jednolity dostęp do wewnętrznej struktury argumentów, czy to par, czy list czy drzew . Ponadto umożliwia przekazywanie wzorców jako argumenty i zwracanie ich jako wyników. Jednolity dostęp ilustruje funkcja dopasowywania wzorców, size
która oblicza rozmiar dowolnej struktury danych . W notacji języka programowania
bondi , jest dany przez funkcję rekurencyjną
let rec size =
| x y -> (size x) + (size y)
| x -> 1
Drugi lub domyślny przypadek x -> 1
dopasowuje wzorzec x
do argumentu i zwraca 1
. Ten przypadek jest używany tylko wtedy, gdy dopasowanie nie powiodło się w pierwszym przypadku. Pierwszy lub specjalny przypadek pasuje do dowolnego związku , takiego jak niepusta lista lub para. Dopasowanie wiąże x
się z lewym i y
prawym komponentem. Następnie korpus obudowy dodaje razem rozmiary tych elementów.
Podobne techniki dają ogólne zapytania do wyszukiwania i aktualizacji. Połączenie rekurencji i dekompozycji w ten sposób daje polimorfizm ścieżki .
Zdolność do przekazywania wzorców jako parametrów ( polimorfizm wzorców ) ilustruje zdefiniowanie eliminatora generycznego. Załóżmy, że dany konstruktor służy Leaf
do tworzenia liści drzewa i Count
zamiany liczb na liczniki. Odpowiednie eliminatory są wtedy
elimLeaf = | Leaf y -> y
elimCount = | Count y -> y
Na przykład elimLeaf (Leaf 3)
ocenia 3
jako elimCount (Count 3)
.
Te przykłady można utworzyć, stosując generyczny eliminator
elim
do odpowiednich konstruktorów. Jest zdefiniowany przez
elim = | x -> | {y} x y -> y
Teraz elim Leaf
oblicza, do | {y} Leaf y -> y
którego jest równoważne elimLeaf
. elim Count
Jest również odpowiednikiem elimCount
.
Ogólnie rzecz biorąc, nawiasy klamrowe {}
zawierają powiązane zmienne wzorca, więc x
są wolne i y
ograniczone | {y} x y -> y
.