Практическое применение исчисления лыжи и BCKW - PullRequest
9 голосов
/ 11 сентября 2010

Я могу понять, как создавать и думать о вычислениях SKI и BCKW, но я так и не смог найти практического применения. Может быть, я не смотрю достаточно глубоко? То есть мне интересно, если (только в качестве примера, я не подразумеваю, что это правда) Java-сервлеты широко используют S, а генераторы Python являются примером BCW, и я просто не могу видеть сквозь лес деревьев?

Ответы [ 4 ]

11 голосов
/ 29 ноября 2011

В Хаскеле они везде !

  • B is <$>
  • C is flip
  • K is pure
  • I is id
  • S is <*>
  • Ш - join

С точки зрения Haskell, <$> означает «делать в контексте».

  • (+2) <$> (*3) означает добавление двух после умножения на три .
  • (+2) <$> [1,2,3] означает добавление двух к каждому элементу в списке .
  • (+2) <$> (read . getLine) означает добавить два к число, которое я только что прочитал .
  • (+2) <$> someParser означает добавление двух к номеру, который я только что проанализировал .

Вещи, имеющие контекст, называются функторами . Все ваши итераторы Java / Python / C ++ являются просто странными версиями функторов наизнанку.

Другое соединение: комбинатор S и K вместе завершают по Тьюрингу. В Haskell pure и <*> вместе образуют аппликативный функтор.

Конечно, понимание того, как вписываются другие комбинаторы, потребует изучения Haskell. Но этот пример показывает, как комбинаторы настолько укоренились в языке.

4 голосов
/ 23 сентября 2011

Исчисления SKI и BCKW стоят отдельно от лямбда-исчисления (которое хорошо известно в концепции функционального программирования), потому что они находятся в бессмысленной форме . См. Также молчаливое программирование . Они составляют основу понимания того, как конструировать функциональные программы без именованных аргументов.

Мы видим его применение на определенных языках (например, Радость и Кошка ). Однажды я написал на Lambda-the-Ultimate.org об отношении исчисления SK к Коту и Радости.

Для чего это стоит: исчисления BCKW и SKI (или SK) практически идентичны, но основа BCKW вышла из моды.

3 голосов
/ 30 ноября 2010

Хотя исчисление лямбды и SKI не отражает системы ввода и вывода большинства языков программирования (таких как графика, сетевые подключения или, возможно, даже стандартный ввод и вывод), способ структурированного практического компьютерного программирования соответствует лямбдеследовательно, SKI и BCKW), такие как идея рекурсии и некоторые способы вызова функций.Многие из этих языков программирования имеют лямбда-абстракции для использования в качестве функций.

2 голосов
/ 27 мая 2011

Все дело в контроле.

Может быть, начать с более низкого уровня. Аппликативная система - это просто система, в которой объекты могут быть применены к другим объектам. Простым примером аппликативной системы является bash. ls | Больше Можно предположить, что они находятся в некоторой среде, и что вышеуказанные средства влияют на окружающую среду, а затем делают больше. В аппликативной записи это больше @ (ls @ environment) Тем не менее, можно сделать более сложные вещи, такие как ls | шаблон grep | Больше Так что теперь в аппликативной записи это больше @ ((grep @ pattern) @ (ls @ environment)). Обратите внимание на grep @ pattern. Grep применяется к шаблону, который возвращает программу для соответствия этому шаблону в результате ls. Это точка приложения, чтобы применить программу к аргументам, создавая новые программы из «атомарных» (или встроенных) программ. Однако мы не можем делать слишком много программирования только с помощью простого приложения или встроенных функций. Нам нужен способ структурирования нашего ввода и применения наших примитивов к нашему вводу.

Вот тут и начинается лямбда. Используя лямбду, можно обобщить (grep @ pattern) Чтобы применить grep к любому входу, (grep @ X) Однако у нас должен быть способ получить входные данные для grep. Таким образом мы обычно используем функции. f (X) = grep @ X Вышеуказанный процесс называется абстрагированием аргумента. Но нет причин думать, что имя f является особенным, поэтому у нас есть синтаксис: лямбда х. grep @ X Затем лямбда X. grep @ X, может быть применена ко входу, и ввод будет подставлен в тело и оценен. Однако замена может привести к путанице, связанные переменные могут быть проблематичными для реализации на машине. S-K-I (или B, C, K, W) дает возможность делать лямбда-элементы без подстановки, а просто обмениваться приложениями.

Напомним, что приложение - это то, что нужно. Очень удобно рассуждать на уровне применения программы к чему-либо (возможно, к другой программе). Лямбда-исчисление дает возможность структурировать ввод и применение программ к аргументам. ЛЫЖ дает способ делать лямбда без явной замены.

Следует отметить, что сокращение SKI по своей природе лениво, поэтому, возможно, необходимо учитывать некоторые аспекты в реальном использовании SKI для структурирования приложений. Действительно, теперь аргументы могли быть полностью оценены, а также могут быть частичным применением. Обойти это можно с помощью теории типов, и только оценивая программу на ее входе, если программа находится в главном положении приложения. То есть, если кто-то пишет с закрытыми лямбда-терминами, переведенными в SKI, тогда если p @ arg1 @ .... Должно быть так, что если p - примитивная программа, то перезапись завершена, и поэтому все ее аргументы 1) доступны, 2) полностью оценены. Тем не менее, я не доказал это, и это может быть не так с достаточно сильной теорией типов ...

...