Як називається λx.λf.fx (наприклад, зворотній варіант) в обчисленні лямбда? Чи має відповідна функція стандартне ім'я в програмуванні?


15

Як називається λx.λf.fx в обчисленні лямбда?

Чи має відповідна функція стандартне ім'я у функціональних мовах програмування, як Haskell?

Чи існує в об'єктно-орієнтованому програмуванні звичайна назва методу, fooякий приймає функцію як аргумент, такий, що x.foo(f)повертається f(x)?


3
Вам потрібно придбати словник.
Роберт Харві

13
Який? Де? Скільки?
Олексій

4
Я не розумію протилежних питань. Мені здається цілком розумним питанням.
Джорджіо

Я опублікував відповідь нижче, але зрозумів, що ОП запитує, як називається цей лямбдаський вираз, тому я видалив = D
Джейсон

Концепція, яку ви посилаєтеся, відома як комбінатор, прочитайте тут, якщо ви не знайомі en.wikipedia.org/wiki/SKI_combinator_calculus, хоча я не знайомий з відомим комбінатором того характеру, на який ви посилаєтесь, C з BCKW близько (це перевертання), але не та сама система en.wikipedia.org/wiki/B,C,K,W_s чому б не повеселитися і придумати комбінацію тих комбінаторів, які приводять до вашої функції :)
Джиммі Хоффа

Відповіді:


9

У Haskell - \x.\f.f xце те, flip ($)що $читається як застосувати , я би читав як зворотне застосувати .

Приблизно на основі /programming/4090168/is-there-an-inverse-of-the-haskell-operator


Це неправильно ... flip is \f.\x.\y.f y xflip is C here en.wikipedia.org/wiki/B,C,K,W_system
Джиммі Хоффа

також додавання $для перевертання, як це, очікує частково застосованої функції, яка бере два аргументи, коли ви збираєтеся лише перевернути останні 2, щоб ви частково застосували всі, крім тих 2
Джиммі Хоффа

6
Отже, ви сумніваєтеся, що (\f.\x.\y.f y x) (\f.\x.f x)зводиться до (\x.\f.f x)перейменування за модулем? Що це робить.
Ден Д.

5

За допомогою стандартних комбінаторів ви можете виразити цю функцію як

C I

де

C f x y = (f y) x

У Haskell це було б

flip id

Ось idтип спеціалізований (a -> b) -> a -> bі для flipswaps a -> bі a.

Ви також можете виразити це в обчисленні SKI :

S (K (S I)) K

+1 для виведення комбінаторів для цього. Я дійсно не підозрюю, що це дуже відома річ, хоча якщо він визначив, що це щось, що стосується церковних цифр, я схильний цікавитись, чи CI документально зафіксовано де-небудь як відповідне в будь-яких дослідженнях церковного числення
Джиммі Хоффа,

5

В оригіналі Алонзо Черча «Обчислення лямбда-перетворення», він позначає цю комбінатора по Т .

У контексті церковних цифр це називається експ . Це відповідає позначенню "скорочення", яке використовує Церква для "застосування" терміна N до терміна M : "[ M N ]" означає "( NM )".

Я ще не чув стандартного імені для аналогічної функції в програмуванні.


3

Іноді це називають комбінатором молочниці , а в Clojure його називають макрокомпонентом . Його основне використання полягає в тому, щоб ви могли виразити обчислення як ряд ланцюгових обчислень у порядку, в якому вони виконуються. Наприклад, взяти значення x, передати його функції f, а потім передати результати f(x)функціїg , буде записано як g(f(x))використання стандартної композиції функцій (або g (f x)якщо ви працюєте з неявними дужками.) Це може бути незручно, коли існує велика кількість ланцюгових функцій, оскільки ви повинні читати їх у зворотному порядку, як вони виконують. Комбінатор молочниці дозволяє висловити це по-різному, якщо ми визначимо комбінатор молочниці як:

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

Тоді вираз T x f g hстає h (g (f x)).

(Для тих, хто шукає додаткову інформацію, а також конкретну реалізацію в мовній ракетці, у мене є повідомлення в блозі на тему: Комбінатор молочниці в ракетці )


2

Я сподіваюся, що я правильно зрозумів ваше запитання, але я вважаю, що це відомий як (зворотний) трубопровідник на мовах ML.

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

Є також оператор зворотних труб, який допомагає впорядковувати операції.

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

Це корисно, тому що нескорочена форма

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

буде помилка, тому що printf намагатиметься оцінити "The value is.." 2і помилка, оскільки не визначено+ оператор. Щоб зробити цю роботу, використовуйте дужки:

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

Що стосується практичного використання, |>оператор неймовірно корисний і хліб-масло з багатьох мов, натхнених ML та ML, таких як F #, LiveScript та Elixir. <|зустрічається рідше і зазвичай використовується лише тоді, коли збільшується читабельність.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.