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 .

Zewnętrzne linki