Это выражение на самом деле довольно круто, хотя это довольно простая операция. В конце концов, функция является просто функцией приложения, не так ли?
Здесь все становится интересным. В исчислении лямбда приложение является синтаксическим правилом, которое просто говорит: «Если f
является выражением, а x
является выражением, то f x
является выражением». Приложение не является функцией. Это печально: поскольку лямбда-исчисление - это все функции, это сосать, чтобы сильно полагаться на то, что не является функцией!
Ваш пример - это своего рода средство от этого. Хотя мы не можем избавиться от приложения, мы можем по крайней мере определить аналог приложения. Этот аналог является лямбда-функцией (λ f . (λ x . (f x)))
(или более идиоматично, λfx.f x
). Это является функцией, поэтому мы можем рассуждать об этом и использовать ее точно так же, как и любую другую функцию. Мы можем передать его в качестве аргументов другим функциям или использовать его как результат функции. Внезапно приложение-приложение стало гораздо более удобным.
Это все, что у меня есть, поскольку исчисление лямбда идет, но эта функция и другие подобные ей также очень полезны в реальной жизни. На языке функционального программирования F # эта функция даже имеет имя, «оператор обратной связи», и мы пишем, что он имеет инфиксный оператор <|
. Таким образом, в качестве альтернативы написанию f (x)
, где x
- некоторое выражение, мы можем написать f <| x
. Это хорошо, поскольку он часто может освободить нас от написания много раздражающих круглых скобок. Ключевым моментом, который я пытаюсь сделать здесь, является то, что, хотя на первый взгляд ваш пример кажется академичным или, возможно, просто не очень полезным, он действительно нашел свой путь на нескольких основных языках программирования.
Большое спасибо, это очищает вещи, хотя мне придется пройти через него один или два раза :) Так как вы упомянули <| оператор в F #, это похоже на оператор $ в Haskell - это то, что это такое? Хотя я думаю, что Haskell's $ основан только на приоритете оператора, а не на этом конкретном правиле, но я, конечно, мог бы ошибиться (и, вероятно, я). –
@PhilipK: Да, я считаю, что '$' и '<|' делают то же самое, и я уверен, что они точно определяют то же самое (не на 100% уверены, хотя). Кажется, я помню, что '' '' и '<|' имеют другой приоритет оператора, но я недостаточно хорошо знаком с Haskell, чтобы точно сказать. –