Как называется λ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_system, почему бы не повеселиться и придумать комбинацию этих комбинаторов, которая приводит к вашей функции :)
Джимми Хоффа

Ответы:


9

В Haskell \x.\f.f xесть , flip ($)который , как $читается как применить , я бы читаться как обратное применять .

Примерно на основе /programming/4090168/is-there-an-inverse-of-the-haskell-operator


Это неправильно ... перевернуть это \f.\x.\y.f y xперевернуть C здесь en.wikipedia.org/wiki/B,C,K,W_system
Джимми Хоффа

Кроме того, добавление $для переворачивания выглядит так, как будто ожидается частично примененная функция, которая принимает более 2 аргументов, при этом вы собираетесь переворачивать только последние 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

В Хаскеле это было бы

flip id

Вот idтип специализируется на (a -> b) -> a -> bи flipменяет 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)).

(Для тех, кто ищет больше информации, а также конкретную реализацию на языке Racket, у меня есть пост в блоге на тему: Thrush Combinator in Racket )


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.