Jak nazywa się λx.λf.fx (podobnie jak odwrotne zastosowanie) w rachunku lambda? Czy odpowiednia funkcja ma standardową nazwę w programowaniu?


15

Jak nazywa się λx.λf.fx w rachunku lambda?

Czy odpowiednia funkcja ma standardową nazwę w funkcjonalnych językach programowania, takich jak Haskell?

Czy w programowaniu obiektowym jest zwykła nazwa metody, fooktóra przyjmuje funkcję jako argument, na przykład x.foo(f)zwracającą f(x)?


3
Musisz kupić słownik.
Robert Harvey

13
Który? Gdzie? Ile?
Alexey

4
Nie rozumiem głosów negatywnych. Wydaje mi się to całkowicie uzasadnionym pytaniem.
Giorgio

Poniżej zamieściłem odpowiedź, ale zdałem sobie sprawę, że OP pyta, jak nazywa się to wyrażenie lambda, więc usunąłem = D
Jason

Pojęcie, o którym mówisz, jest znane jako kombinator, przeczytaj tutaj, jeśli nie jesteś zaznajomiony pl.wikipedia.org/wiki/SKI_combinator_calculus, chociaż nie znam znanego kombinatora natury, o której mówisz, C z BCKW jest blisko (to flip), ale nie ten sam en.wikipedia.org/wiki/B,C,K,W_system, dlaczego nie zabawić się i wymyślić kombinację tych kombinatorów, które dają twoją funkcję :)
Jimmy Hoffa

Odpowiedzi:


9

W Haskell, \x.\f.f xjest flip ($)który, jak $się czytać jak stosować , chciałbym odczytywać jako odwrotnego zastosowania .

Z grubsza na podstawie /programming/4090168/is-there-an-inverse-of-the-haskell-operator


To źle ... flip is \f.\x.\y.f y xflip is C here en.wikipedia.org/wiki/B,C,K,W_system
Jimmy Hoffa

dodawanie $do flipa w ten sposób oczekuje częściowo zastosowanej funkcji, która przejmie 2 argumenty, w których zamierzasz przerzucić tylko ostatnie 2, więc częściowo zastosujesz wszystkie oprócz tych 2
Jimmy Hoffa

6
Więc wątpisz, czy (\f.\x.\y.f y x) (\f.\x.f x)sprowadza się to do (\x.\f.f x)zmiany nazwy modulo? Które to robi.
Dan D.

5

Za pomocą standardowych kombinacji można wyrazić tę funkcję jako

C I

gdzie

C f x y = (f y) x

W Haskell byłoby

flip id

Oto idtyp specjalizuje się (a -> b) -> a -> bi flipzamienia a -> bi a.

Możesz to również wyrazić w rachunku SKI :

S (K (S I)) K

+1 za odjęcie za to kombinacji. Naprawdę nie podejrzewam, że jest to bardzo znana rzecz, chociaż jeśli zidentyfikował, że jest to coś związanego z cyframi kościelnymi, jestem skłonny zastanawiać się, czy CI jest gdziekolwiek udokumentowane jako istotne w jakichkolwiek badaniach liczbowych w kościele
Jimmy Hoffa

5

W oryginale Alonzo Church „The kamicy lambda-nawrócenia”, to oznacza to COMBINATOR przez T .

W kontekście cyfr kościelnych nazywa się to exp . Jest to zgodne z notacją „stenograficzną” używaną przez Kościół do „zastosowania” terminu N do terminu M : „[ M N ]„ oznacza „( NM )”.

Nie słyszałem jeszcze o standardowej nazwie dla analogicznej funkcji w programowaniu.


3

Jest to czasami określane jako kombinator drozda , aw Clojure nazywa się makro pierwszego wątku . Jego podstawowym zastosowaniem jest umożliwienie wyrażenia obliczeń jako serii obliczeń łańcuchowych w kolejności ich wykonywania. Na przykład, przyjmowanie wartości x, przekazywanie jej do funkcji f, a następnie przekazywanie wyników f(x)do funkcji g, byłoby zapisywane jako g(f(x))używając standardowego składu funkcji (lub g (f x)jeśli pracujesz z niejawnymi nawiasami). Może to być niezręczne, gdy istnieje wiele łańcuchowych funkcji, ponieważ musisz je odczytać w odwrotnej kolejności, w jaki sposób działają. Kombinator drozda pozwala wyrazić to inaczej, jeśli zdefiniujemy kombinator drozda jako:

T x f = f x
T x f g ... = T (T x f) g ...

Wtedy wyrażenie T x f g hstaje się h (g (f x)).

(Dla tych, którzy szukają więcej informacji, a także konkretnej implementacji w języku Racket, mam wpis na blogu na ten temat: Thrush Combinator in Racket )


2

Mam nadzieję, że dobrze rozumiem twoje pytanie, ale uważam, że jest to znane jako (odwrotny) operator rur w językach ML.

[1; 2; 3] |> List.map sq // let it = [1; 4; 9]

Istnieje również operator odwróconej rury, który pomaga w kolejności operacji.

printf "The value is.." <| 2 + 3 // let it = "The value is..5"

Jest to przydatne, ponieważ niepippowana forma

printf "The value is.." 2 + 3 ;; error

wystąpił błąd, ponieważ printf próbowałby ocenić, "The value is.." 2a błąd, ponieważ nie ma zdefiniowanego +operatora. Aby to zadziałało, użyj nawiasów:

printf "The value is.." (2 + 3) // let it = "The value is..5"

Jeśli chodzi o praktyczne zastosowanie, |>operator jest niezwykle przydatny, a chleb powszedni wielu języków ML i inspirowanych ML, takich jak F #, LiveScript i Elixir. <|jest mniej powszechny i ​​zwykle używany tylko wtedy, gdy zwiększa czytelność.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.