2010-12-20 3 views
5

Existe-t-il un moyen d'appliquer la fonction aux membres de tuple en tant qu'arguments de fonction? Ou sinon, puis-je de toute façon créer une fonction avec un nombre arbitraire d'arguments et dans son corps appliquer une autre fonction à la "queue" comme ce serait ses arguments?Déplier le tuple dans OCaml

Répondre

7

Dans le cas général, non. Dans le cas de 2 arguments, vous pouvez utiliser les fonctions curry et uncurry dans le Batteries extensions to Pervasives.

Il pourrait être possible de faire cuire quelque chose avec le module Obj, comme les entrailles de printf faire, mais je resterais très loin de là. La difficulté est que le système de types ne vous donne pas le moyen d'exprimer le type d'une fonction généralisée curry ou uncurry. Le système de type ne vous laisse pas "calculer" sur la longueur d'un tuple - un 2-tuple est un 2-tuple et vous n'avez pas un moyen d'exprimer que (a*b*c) est vraiment (a*b) avec un composant supplémentaire. printf dispose d'un support spécial du compilateur pour que les types fonctionnent correctement, et il en résulte que le type de fonction fait partie du type de format (donc des solutions similaires ne fonctionneront pas pour les tuples).

7

Le langage lui-même ne vous permet pas de définir une fonction sur des tuples de taille arbitraire.

Il est cependant possible de définir des fonctions avec un nombre arbitraire d'arguments en suivant this folding technique (il est décrit ici pour SML mais fonctionne aussi bien dans OCaml).