В C ++ программа может передавать ссылку, а не значение функции.
void incrementInt(int &x)
{
++x;
}
OCaml предлагает такую же функциональность?
Нет, строгого эквивалента нет.
Есть ref
s, которые похожи на указатели на новую выделенную память, и есть записи, массивы, объекты и значения других составных типов данных, которые передаются «по ссылке на объект», что снова означает, что они действуют как указатель на новую выделенную память.
Однако нет эквивалента указателю на переменную или ссылке на C ++.
В OCaml не будет заметной разницы между передачей по значению и передачей по ссылке, потому что невозможно присвоить переменную в OCaml. Например, ваш ++x
невозможно в OCaml.
Разница между передачей по значению и передачей по ссылке заключается в том, что происходит, когда параметр назначается внутри вызываемой функции — при передаче по значению это не влияет на переданную переменную (если переменная была прошло); в передаче по ссылке это имеет тот же эффект, что и присвоение переданной переменной в вызывающей области. В OCaml нельзя присвоить переменную, поэтому это различие не существует. Если бы OCaml был «передачей по ссылке», он работал бы точно так же, как если бы это было «передачей по значению».
Вы можете передавать ссылки на изменяемые структуры данных и использовать это для совместного использования состояния между функциями, но это не имеет ничего общего с передачей по ссылке, как вы можете сделать это на языках с передачей только по значению, таких как C и Java. ,
В OCaml параметры передаются по значению. Значение само по себе может быть изменяемым или неизменным. Первый может быть изменен вызываемым абонентом, и он будет виден вызывающему абоненту. Неизменная ценность, очевидно, не может быть изменена. Изменчивость значения определяется его типом. Большинство типов значений в OCaml являются неизменяемыми. Заметными исключениями являются массивы и строки (в более новой версии строки OCaml стали неизменяемыми, но давайте пропустим эту тему). Например, значения типа int
неизменны. Это вполне естественно — если у вас есть номер 5
это всегда число 5
Вы не можете изменить его. Однако вы можете поместить это число в изменяемую ячейку и передать эту ячейку функции. Так что функция, может изменить содержимое ячейки. Обратите внимание, что мы не меняем сам номер, мы просто помещаем другой номер в ту же ячейку, например,
type cell = {
mutable value : int;
}
let incr x =
x.value <- x.value + 1
incr
Функция берет значение из ячейки, создает новое значение, увеличивая его, а затем помещает новый значение в клетку.
Мы можем параметризовать тип cell
так что он может содержать значение любого типа, например,
type 'a cell = {
mutable value : 'a;
}
На самом деле, ref
Тип на самом деле выглядит одинаково (по модулю имени). Он определен в стандартной библиотеке следующим образом;
type 'a ref = {
mutable contents : 'a;
}
Понятие передачи по ссылке было создано языками, которые пропускали свои собственные абстракции и заставляли программиста понимать, как параметры передаются в функцию. В OCaml вы можете забыть это как страшный сон. Каждый параметр в OCaml принимает только одно машинное слово и передается через регистр или через стек, если параметров слишком много. С точки зрения программиста на C каждое значение является скаляром или указателем. Целые числа и унарные конструкторы (варианты) передаются в виде скаляров, где составные типы данных всегда передаются указателем.
Наиболее близким может быть:
let x=ref 3;;
let incrementInt x =
x := !x+1;;
incrementInt x;;
# !x;;
- : int = 4
Как сказал sepp2k, это не то же самое.