По сути, системы типов 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");;