2012-05-19 3 views
6

"Introduction to Caml" говоритПочему вы предпочитаете использовать кортеж аргументов в OCaml?

Обратите внимание, в Caml, лучше использовать выделанное определение функций для нескольких аргументов функций, а не кортежи.

при сравнении 'a -> 'b -> 'c, вызывающий соглашения до 'a * 'b -> 'c.

При работе с SML/NJ я привык использовать типы кортежей для ввода и вывода: ('a * 'b) -> ('c * 'd), поэтому использование кортежей для выражения нескольких входов кажется симметричным тем, как я выражаю несколько выходов.

Почему currying рекомендуется для деклараций функций OCaml над аргументами в кортеж? Является ли это большей гибкостью, обеспечивающей каррирование/частичную оценку, или есть ли какая-то другая польза, которая вытекает из деталей реализации компилятора OCaml?

+2

. Выбор каррирования большинства функций в Caml-свете и последующих версиях объясняется в отчете «Эксперимент ZINC: экономичная реализация языка ML». Одна вещь, которую я помню, заключается в том, что при правильной схеме оценки (описанной в отчете) функция curried не требует выделения для вызова. http://caml.inria.fr/pub/papers/xleroy-zinc.ps.gz –

+0

@PascalCuoq, тогда как кортеж должен быть выделен, распакован, а затем GCed? –

+0

Да, если функция также предназначена для вызова с уже существующими кортежами ('ft'), нет никакого способа избежать того, что кратковременный временный кортеж' (x, y) 'должен быть назначен для применения' f', когда у кого есть только 'x' и' y'. –

ответ

2

Да, это в основном нотация и гибкость для частичного применения. Curried функции идиоматичны в OCaml, и компилятор, скорее всего, оптимизирует их несколько лучше, чем набор функций (тогда как компиляторы SML обычно оптимизируют для кортежей).

Достоинства tupling - это симметрия аргумента/результата, которую вы упомянули (что особенно полезно при составлении функций) и, возможно, новаторское знакомство (по крайней мере, для людей, прибывающих из нефункционального мира).

1

Некоторые комментарии об оптимизации в OCaml.

В OCaml я заметил, что кортежи всегда выделяются при передаче их в качестве аргумента. Даже если выделение в первичной куче быстро происходит в ocaml, это, конечно, больше, чем ничего не делать. Таким образом, каждый раз, когда вы передаете кортеж в качестве аргумента, время от времени распределяется и заполняется кортежем.

Я ожидал, что компилятор ocaml будет оптимизировать случаи, когда нет необходимости строить кортеж. Например, когда вы встраиваете вызываемую функцию, вы можете использовать только компоненты кортежа, а не сам кортеж. Таким образом, кортеж можно просто игнорировать. К сожалению, в этом случае OCaml не удаляет бесполезный кортеж и все еще выполняет выделение. По этой причине не рекомендуется использовать кортежи в критических разделах кода.

+0

Я думаю, что это уже не так. [«OCaml умнее, чем я думал»] (https://blogs.janestreet.com/ocaml-is-smarter-than-i-thought/) говорит: «Я бы предотвратил вложение, но все равно не было выделено! Почему? Ну, получается, что OCaml может оптимизировать функцию набора кортежей, чтобы получить элементы кортежа, переданные через регистры, что и произошло. И снова компилятор понял, что никакого распределения не требуется ». –

5

Я думаю, что многие из них согласуются - стандартные функции библиотеки в OCaml являются тонами, тогда как в стандартном ML они, как правило, не исключают некоторых функций более высокого порядка. Однако существует одна разница, запеченная в языке: операторы (например, (*)) находятся в OCaml (например, int -> int -> int); тогда как они не загружаются в стандартный ML (например, op* может быть (int * int) -> int). Из-за этого встроенные функции более высокого порядка (например, fold) также выполняют функцию, которая находится в OCaml и не загружена в стандартном ML; это означает, что для того, чтобы ваша функция работала с этим, вам необходимо следовать соответствующему соглашению, и это следует из этого.

+1

Хорошая точка. Существует еще один пример, в котором выбор выпекается в: конструкторах типа данных. В SML они загружаются, в Haskell они курсируют. Как ни странно, в OCaml они чередуются, что немного несоответствует остальной части языка. –

+1

Более глубокое значение, связанное с построением конструкторов типов данных, состоит в том, что кортеж представляет собой анонимный конструктор данных специального случая. –

Смежные вопросы