Подтвердить что ты не робот

Почему OCaml (+) не является полиморфным?

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

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

4b9b3361

Ответ 1

Ocaml не поддерживает полиморфные операторы (числовые или иные), кроме операторов сравнения. Объект + versus +. устраняет множество тонких ошибок, которые могут возникать при преобразовании разных размеров целых чисел, чисел с плавающей запятой и других числовых типов назад и вперед. Это также означает, что компилятор всегда точно знает, какой числовой тип используется, тем самым облегчая распознавание, когда программист сделал неправильные предположения о числе, всегда имеющем целочисленное значение. Требование явного литья между числовыми типами может показаться неудобным, но в конечном итоге это, вероятно, сэкономит вам больше времени на отслеживание странных ошибок, чем вам приходится тратить, чтобы написать, что дополнительный период будет явным.

Помимо версий числовых операторов ., я не думаю, что синтаксис Ocaml особенно странный. Это очень похоже на предыдущие языки ML с соответствующими и разумными расширениями синтаксиса для его дополнительных функций. Если это изначально кажется странным для вас, это, вероятно, просто указывает, что вы до сих пор были только программированием на языках с близким родственным синтаксисом. Когда вы изучаете новые языки, вы увидите, что существует много разных способов синтаксиса языка с различными преимуществами и недостатками, но многие из них - это просто произвольные соглашения, которые кто-то решил.

Ответ 2

Я бы хотел, чтобы оператор "+" был полиморфным для поддержки целого числа, float и т.д. Зачем нам нужно "+."?

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

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

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

Недостатки:

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

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

Ответ 3

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

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

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");;