Ответ 1
Это зависит от того, что вы подразумеваете под минимальным.
Для начала, предком функциональных языков является, прежде всего, математическая логика. После этого произошло вычислительное использование определенных логик. В некотором смысле многие математические системы (ядра которых обычно весьма минимальны) можно назвать функциональными языками. Но я сомневаюсь, что вы после этого!
Самый известный Церковь Алонсо лямбда-калькуляция, из которые есть варианты и потомки:
-
Простейшая форма - это то, что называется нетипизированным лямбда-исчислением; это не содержит ничего, кроме лямбда-абстракций, без ограничений на их использование. Создание структур данных, использующих только анонимные функции, осуществляется с помощью так называемой Церковной кодировки и представляет данные по фундаментальным операциям на ней; число 5 становится "повторять что-то 5 раз" и т.д.
-
Lisp -семейные языки - это немного больше, чем нетипизированное лямбда-исчисление, дополненное атомными значениями, минус-ячейками и несколькими другими вещами. Я подозреваю, что Scheme является самым минималистом здесь, как будто память служит мне, он был создан сначала как учебный язык.
-
Исходная цель лямбда-исчисления, описывающая логические доказательства, не удалась, когда нетипизированная форма была показана несовместимой, что является вежливым термином для "позволяет доказать, что ложь истинна". (Исторические мелочи: документ, подтверждающий это, что в то время значило, сделало это, написав логическое доказательство, которое в вычислительных терминах перешло в бесконечный цикл.) Во всяком случае, использование в качестве логики было восстановлено путем введения < сильное > типизированное лямбда-исчисление. Они, как правило, не могут быть непосредственно полезны в качестве языков программирования, тем более, что, поскольку логически звук делает язык не Тьюрингом полным.
-
Однако, подобно тому, как Lisps происходит из нетипизированного лямбда-исчисления, типизированное лямбда-исчисление, расширенное со встроенной рекурсией, алгебраическими типами данных и несколькими другими вещами, дает вам расширенное семейство языков ML. Они, как правило, минимальны в сущности, с синтаксическими конструкциями, имеющими прямые переводы на лямбда-термины во многих случаях. Помимо явных диалектов ML, это также включает Haskell и несколько других языков. Однако я не знаю каких-либо особенно минималистских типизированных функциональных языков; такой язык, вероятно, будет страдать от плохого юзабилити гораздо хуже, чем минималистский нетипизированный язык.
Таким образом, по сравнению с вариантами лямбда-исчисления, чистое нетипизированное лямбда-исчисление без каких-либо дополнительных возможностей является завершением Turing и примерно минимальным, чем вы можете получить!
Однако, возможно, более минимальным является полное исключение понятия "переменные" - на самом деле это было изначально сделано для упрощения мета-математических доказательств о логических системах, если мне служит память, и использовать только функции более высокого порядка называемых комбинаторами. Здесь мы имеем:
-
Комбинационная логика сама по себе, как первоначально изобретено Моисей Шонфинкель и широко развернуто Haskell Curry. Каждый комбинатор определяется простым правилом подстановки, например
Sxyz = xz(yz)
. Строчные буквы используются как переменные в этом определении, но имейте в виду, что сама комбинаторная логика не использует переменные или вообще присваивает имена. Разумеется, комбинационная логика минимальна, но не слишком дружелюбна как язык программирования. Наиболее известной является комбинатор SK. S определяется как в приведенном выше примере; KKxy = x
. Этих двух комбинаторов достаточно, чтобы сделать его Тьюрингом! Это почти пугающе минимально. -
Unlambda - это язык, основанный на комбинаторах SK, расширяющий его с помощью нескольких дополнительных комбинаторов со специальными свойствами. Менее минимально, но позволяет писать "Hello World".
-
Однако даже два комбинатора - это больше, чем вам нужно. Существуют различные основы одного комбинатора; возможно, самым известным является iota Combinator, определенный как
ιx = xSK
, который используется в минималистском языке, также называемом Iota -
Также есть примечание Lazy K, который отличается от Unlambda тем, что не вводит дополнительных комбинаторов, не имеет побочных эффектов и использует ленивую оценку. В принципе, это Haskell из мира на основе комбинатора-эзотерического языка. Он поддерживает как базу SK, так и iota combinator.
Какой из них поражает вас как самого "минимального", вероятно, является вопросом вкуса.