Развернуть кортеж в OCaml - PullRequest
       7

Развернуть кортеж в OCaml

5 голосов
/ 20 декабря 2010

Есть ли способ применить функцию к членам кортежа в качестве аргументов функции?Или, если нет, могу ли я так или иначе создать функцию с произвольным числом аргументов и в ее теле применить какую-то другую функцию к «хвосту», как это было бы ее аргументами?

Ответы [ 2 ]

7 голосов
/ 20 декабря 2010

Сам язык не позволяет вам определять функцию для кортежей произвольного размера.

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

7 голосов
/ 20 декабря 2010

В общем случае нет. Для случая с 2 аргументами вы можете использовать функции curry и uncurry в расширениях Battery для Pervasives .

Возможно, можно что-то приготовить с помощью модуля Obj, как это делает внутреннее устройство printf, но я бы держался далеко от этого. Сложность состоит в том, что система типов не позволяет выразить тип обобщенной функции curry или uncurry. Система типов не позволяет вам «вычислять» длину кортежа - 2-кортеж - это 2-кортеж, и у вас нет способа выразить, что (a*b*c) действительно (a*b) с дополнительным компонентом. printf имеет специальную поддержку от компилятора для правильной работы типов, и это приводит к тому, что тип функции является частью типа формата (поэтому аналогичные решения не будут работать для кортежей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...