[Ocaml] Как не расстраиваться из-за отсутствия перегрузки?

agaaaa

Как-то не привычно после C++/C# каждый новый оператор называть по-новому. Да и для функций придумать простые имена нетривиально, когда у разных типов есть схожие операции.

doublemother

Ну для многих функций подходит тип 'a

karkar

Разбивать на модули, вестимо.
open ExtString

module A = struct
let (++) a b = DynArray.add a b
end

module S = struct
let (++) a b = a ^ String.of_char b
end

let arr = DynArray.create ;;
let str = "abc";;

open A;;
arr ++ 1;;
arr ++ 2;;
DynArray.iter (Printf.printf "%d ") arr;;

open S;;
let s1 = str ++ 'd' in
let s2 = s1 ++ 'e' in
print_endline s2;;

Выводит "1 2 abcde".

Dasar

а если так сделать - тоже будет работать?
open A;;
open S;;

arr ++ 1;;
arr ++ 2;;
DynArray.iter (Printf.printf "%d ") arr;;

let s1 = str ++ 'd' in
let s2 = s1 ++ 'e' in
print_endline s2;;

karkar

Нет, последний открытый модуль перекрывает определения, т.е. ++ будет прибавлять символ к строке.
Можно заюзать расширение, позволяющее писать open A in arr ++ 1, т.е. открывать модуль локально, для выбранной части кода.
Оставить комментарий
Имя или ник:
Комментарий: