Что означает. {X} в OCaml? - PullRequest
6 голосов
/ 21 июля 2011

В настоящее время я пытаюсь перенести OCaml на F #. Я "в глубоком конце" с OCaml, и мой F # немного ржавый.

В любом случае, код OCaml прекрасно работает в компиляторе OCaml, но (что неудивительно) выдает множество ошибок в компиляторе F # даже при включенной совместимости с ML. Некоторые из ошибок выглядят зарезервированными словами, но основная часть ошибок жалуется на .{ в таких строках, как:

 m.(a).(b) <- w.{a + b * c};

a, b, c - целые числа.

Я много занимался поиском на сайтах OCaml, в Stackoverflow, в переводе на английский язык французской книги О'Рейли и т. Д. И не могу найти ничего подобного. Конечно, это не помогает, что у большинства средств поиска есть проблемы со знаками препинания! Да, я нашел ссылки на ., используемые для ссылки на элементы записи, и { }, используемые для определения записей, но оба вместе? Из использования я предполагаю, что это какой-то ассоциативный или разреженный массив?

Что означает этот синтаксис? Что является ближайшим эквивалентом F #?

1 Ответ

9 голосов
/ 21 июля 2011

PDF-файл документации / руководства oCaml доступен здесь:

http://caml.inria.fr/distrib/ocaml-3.12/ocaml-3.12-refman.pdf

На странице 496 (в нижней части страницы) говорится об общих массивах и их методе get:

val get: (’a,’ b, ’c) t -> int array ->’ a

Считать элемент общего большого массива. Genarray.get a [| i1; ...; iN |] возвращает элемент, координаты которого i1 в первом измерении, i2 во втором размерность , ., iN в N-м измерении.

Если a имеет макет C, координаты должны быть больше или равны 0 и строго меньше соответствующие размеры. Если a имеет разметку Fortran, координаты должны быть больше или равно 1 и меньше или равно соответствующим размерам a. поднимать Invalid_argument, если массив a не имеет ровно N измерений или если координаты находятся за пределами массива.

Если N> 3, предоставляется альтернативный синтаксис: вы можете написать. {I1, i2, ..., iN} вместо Genarray.get a [| i1; ...; В |]. (Синтаксис a. {...} с одним, двумя или тремя координаты зарезервированы для доступа к одно-, двух- и трехмерным массивам как описано ниже.)

Далее говорится (в частности, об одномерных массивах):

val get: (’a,’ b, ’c) t -> int ->’ a

Array1.get a x или, альтернативно, a. {X} возвращает элемент a с индексом x. x must быть больше или равно 0 и строго меньше, чем Array1.dim a, если a имеет макет C. Если имеет формат Fortran, x должен быть больше или равен 1 и меньше или равен Array1.dim a. В противном случае Invalid_argument повышается.

В F # вы можете получить доступ к элементам массива, также используя метод Array.get. Но более близкий синтаксис будет w.[a + b * c]. Короче говоря, в F # используйте [] вместо {}.

...