Ваша дихотомия "Haskell против мира ML" неверна¹.SML также продвигает конструкторы для функций, а Caml Light - для.Я не уверен, почему он был удален в OCaml, я думаю, дизайнер подумал, что в этом нет особой необходимости.
Существуют глубокие причины, по которым конструкторы немного специфичны.Они могут использоваться в шаблонах, в то время как общие функции не могут - я думаю, это можно объяснить в терминах поляризованной логики и фокусировки2.Кроме того, конструктор, примененный к значениям, может рассматриваться как значение, хотя это не так для общих функций.В языках вызовов по значению принято ограничивать определение рекурсивных значений подклассом, который допускает применение конструктора, но не приложение общей функции.
Я согласен, что «семантический сахар» продвижения всех конструкторов в функцииотлично.Однако я думаю, что это было бы не очень полезно, если бы у нас был хороший синтаксический сахар для короткой абстракции, такой как Some(_)
от Scala.Должны ли конструкторы быть вычеркнутыми (ваше замечание о «частичном применении») или нет - это другой и ортогональный вопрос, на мой взгляд.
¹: помимо неправильной дихотомии, тон вашего вопроса имеет определенный вкус«Хаскелеры и MLers, вот кольцо, пожалуйста, борись!».Это не может быть преднамеренным, но в любом случае вам следует избегать таких формулировок.Языковой дизайн сделан из компромиссов, и допущение, когда два разных языка сделали разные выборы, что один из них правильный , а не другой, не является хорошим подходом.
PS:с тех пор вопрос был отредактирован и теперь стал гораздо более нейтральным.Спасибо за редактирование.
²: по просьбе petebu, здесь есть немного больше (на самом деле намного больше) информации о «фокусировке и полярности».Я хотел бы отметить, что я действительно не эксперт по этой теме (отсюда и «я думаю»).
Я бы рекомендовал сначала статью Сосредоточение на сопоставлении с образцом (PDF) от Neelakantan Krishnaswami, 2009. Он содержит введение для людей, не разбирающихся в поляризованной логике и фокусировке (но вы должны быть хотя бы знакомы с последовательным исчислением).Как обычно в последовательном исчислении, типы / предложения вводятся «справа» и исключаются / деконструируются «слева».Но здесь мы разделяем типы по «полярности», продукт и суммы являются положительными, а функции - отрицательными (моя интуиция заключается в том, что продукт / суммы - это данные, а функции - вычисления, но разделение мотивируется очень естественными соображениями относительно их поведения в последовательном исчислении),и в статье показано, что исключение слева типов стрелок соответствует применению функции, а исключение слева типов суммы / произведения соответствует сопоставлению с образцом.Существует конструкция case
, которая ведет себя аналогично сопоставлению с образцом (с некоторыми отличиями), которая исключает положительные значения, поэтому ее нельзя применять к функциям.
Другой важной ссылкой будет Сосредоточение на связывании иВычисления Дана Ликаты, Ноама Цейлбергера и Роберта Харпера, 2008 г. (обратите внимание, что если вы планируете представить доклад по этим темам, «Сосредоточиться на ...» становится немного клише).В нем гораздо меньше подчеркивается связь с сопоставлением с образцом в стиле ML, но вводится очень приятная идея, что, хотя вычислительные стрелки «отрицательны слева» (легко воспринимаемые как классическая эквивалентность A→B ≡ ¬A∨B
), можно ввести другую стрелку ».положительный слева ", поэтому положительно поляризованный, который может быть сопоставлен с шаблоном.Оказывается, эта стрелка хорошо подходит для представления привязок переменных (если вы знакомы с абстрактным синтаксисом высшего порядка, идея состоит в том, что левая полярность исключает «экзотические термины», которые пытаются вычислить их переменные), так чтоТермины с привязками переменных - это структура данных, которая может быть сопоставлена с шаблоном, как суммы или продукты.
I fouи их бумаги немного трудно читать, поэтому я бы начал с слайдов Дана Ликаты .Наконец, Роберт Харпер сделал другие слайды , которые дают иную интуицию в терминах индуктивных суждений / дериваций: положительные стрелки представляют выводимость (не могли бы вы построить деривацию C по гипотезе Aи B?) в то время как отрицательные стрелки представляют допустимость (учитывая производные A и B, как бы вы переписали / исследовали / манипулировали ими для создания производного C?).Очень интересные вещи.