Я новичок в OCaml. Мне нравится скорость OCaml, но я не совсем понимаю ее дизайн. Например, я бы хотел, чтобы оператор +
был полиморфным для поддержки целого числа, float и т.д.
Зачем нам нужно +.
?
Я новичок в OCaml. Мне нравится скорость OCaml, но я не совсем понимаю ее дизайн. Например, я бы хотел, чтобы оператор +
был полиморфным для поддержки целого числа, float и т.д.
Зачем нам нужно +.
?
Ocaml не поддерживает полиморфные операторы (числовые или иные), кроме операторов сравнения. Объект +
versus +.
устраняет множество тонких ошибок, которые могут возникать при преобразовании разных размеров целых чисел, чисел с плавающей запятой и других числовых типов назад и вперед. Это также означает, что компилятор всегда точно знает, какой числовой тип используется, тем самым облегчая распознавание, когда программист сделал неправильные предположения о числе, всегда имеющем целочисленное значение. Требование явного литья между числовыми типами может показаться неудобным, но в конечном итоге это, вероятно, сэкономит вам больше времени на отслеживание странных ошибок, чем вам приходится тратить, чтобы написать, что дополнительный период будет явным.
Помимо версий числовых операторов .
, я не думаю, что синтаксис Ocaml особенно странный. Это очень похоже на предыдущие языки ML с соответствующими и разумными расширениями синтаксиса для его дополнительных функций. Если это изначально кажется странным для вас, это, вероятно, просто указывает, что вы до сих пор были только программированием на языках с близким родственным синтаксисом. Когда вы изучаете новые языки, вы увидите, что существует много разных способов синтаксиса языка с различными преимуществами и недостатками, но многие из них - это просто произвольные соглашения, которые кто-то решил.
Я бы хотел, чтобы оператор "+" был полиморфным для поддержки целого числа, float и т.д. Зачем нам нужно "+."?
Отличный вопрос. Здесь много тонких компромиссов.
Преимуществами операторов без перегрузки (как в OCaml) являются:
Недостатки:
+
для int
, +.
для float
, +/
для рациональных значений произвольной точности, +|
для векторов +||
для матриц и комплексные числа, низкоразмерные векторы и матрицы, однородные координаты и т.д.Некоторые альтернативы:
2.3/0
и 1/12*3.7
.В принципе, системы типов 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");;