Почему OCaml (+) не является полиморфным? - PullRequest
27 голосов
/ 05 ноября 2011

Я новичок в OCaml. Мне нравится скорость OCaml, но я не совсем понимаю его дизайн. Например, я бы хотел, чтобы оператор + был полиморфным для поддержки целых чисел, чисел с плавающей точкой и так далее.

Зачем нам нужно +.?

Ответы [ 3 ]

25 голосов
/ 08 марта 2012

Я бы хотел, чтобы оператор '+' был полиморфным для поддержки целых чисел, чисел с плавающей точкой и так далее. Зачем нам нужен '+.'?

Отличный вопрос. Здесь есть много тонких компромиссов.

Преимущества операторов без перегрузки (как в OCaml):

  • Вывод типа проще и более предсказуем.
  • Код является более составным: перемещение кода из одного места в другое не может повлиять на его значение.
  • Предсказуемая производительность: вы всегда точно знаете, какая функция вызывается.

Недостатки:

  • Количество различных операторов быстро выходит из-под контроля: + для int, +. для float, +/ для рациональных рациональных чисел, +| для векторов, +|| для матриц и комплексные числа, низкоразмерные векторы и матрицы, однородные координаты и т. д.

Некоторые альтернативы:

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

Ocaml не поддерживает полиморфные операторы (числовые или иные), кроме операторов сравнения.Функция + против +. устраняет множество тонких ошибок, которые могут возникнуть при преобразовании целых чисел, чисел с плавающей запятой и других числовых типов назад и вперед.Это также означает, что компилятор всегда точно знает, какой числовой тип используется, что облегчает распознавание, когда программист сделал неверные предположения о числе, всегда имеющем целочисленное значение.Требовать явного приведения между числовыми типами может показаться неудобным, но в долгосрочной перспективе это, вероятно, сэкономит вам больше времени на поиск странных ошибок, чем вы тратите, чтобы записать этот дополнительный период для явного указания.1005 * версии числовых операторов, я не думаю, что синтаксис Ocaml особенно странно.Это очень соответствует предыдущим языкам ML с соответствующими и разумными расширениями синтаксиса для его дополнительных функций.Если вам это изначально кажется странным, это, вероятно, просто означает, что вы до сих пор занимались программированием только на языках с тесно связанным синтаксисом.Изучая новые языки, вы увидите, что существует много разных способов иметь языковой синтаксис с разными преимуществами и недостатками, но во многом это просто произвольные соглашения, которые кто-то решил.

3 голосов
/ 24 декабря 2015

По сути, системы типов SML и OCaml (игнорируя объектную систему и модули) не поддерживают специальный полиморфизм.Это дизайнерское решение.OCaml также, в отличие от SML, решил не включать синтаксический сахар для арифметики.

Некоторые языки в семействе ML имеют чрезвычайно ограниченные формы специального полиморфизма в числовых операторах.Например, (+) в Standard ML имеет тип по умолчанию (int, int) -> int, но имеет тип (float, float) -> float, если его аргумент или тип возвращаемого значения известны и равны float.Эти операторы являются специальными в SML и не могут быть определены, если они еще не были встроены. Также невозможно наделить другие значения этим свойством.val add = (+) будет иметь тип (int, int) -> int.Особенность здесь сводится к синтаксису языка, в системе типов не поддерживается специальный полиморфизм.

OCaml имеет несколько операторов со специальной семантикой (но числовые операторы среди них отсутствуют),например, || и && имеют короткое замыкание (но становятся длинными, если вы назначите им промежуточное значение)

let long_circuit_or = (||);;
let print_true x = print_string x; true;;
(* just prints "4" *)
print_true "4" || print "5";;
(* prints "45" *)
long_circuit_or (print_true "4") (print_true "5");;
...