Кортеж - это не просто синтаксическая конструкция, он представляет собой реальную структуру данных.Это означает, что fun (x,y)
(очень немного) менее эффективен, чем f x y
в том случае, если x
и y
еще не объединены, поскольку должен быть выделен кортеж.Если это не ясно, грубый эквивалент в Java будет
void foo(X x, Y y) { ... }
void bar(Tuple<X,Y> t) { ... }
/* client code */
X x = new X();
Y y = new Y();
foo(x, y); // Just uses x and y directly
bar(new Tuple<X,Y>(x, y)); // Has to "new" a Tuple
. По этой причине обычно предпочтительнее избегать использования кортежей в качестве аргументов функции, если у вас нет веских причин для этого.
PS Аналогичное соображение применимо к объявлениям типов данных, где следующее несколько незначительно отличается:
type 'a foo = Foo of 'a * 'a;
type 'a bar = Bar of ('a * 'a);
Foo
- конструктор типа данных, который принимает два аргумента.Bar
- это конструктор, который принимает один аргумент (кортеж).