You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Методы могут объявляться с несколькими списками параметров. При этом когда такой метод вызывается с меньшим количеством списков параметров, это приводит к созданию новой функции, которая ожидает на вход не достающий список параметров. Формально это называется [частичное применение](https://en.wikipedia.org/wiki/Partial_application).
11
+
Методы могут объявляться с несколькими списками параметров.
Рассмотрим такие примеры из класса [Traversable](/overviews/collections/trait-traversable.html) коллекции Scala:
29
+
{% endtab %}
27
30
28
-
```scala mdoc:fail
31
+
{% tab 'Scala 3' for=foldLeft_definition %}
32
+
33
+
```scala
34
+
traitIterable[A]:
35
+
...
29
36
deffoldLeft[B](z: B)(op: (B, A) =>B):B
37
+
...
30
38
```
31
39
32
-
`foldLeft` применяет бинарный оператор `op` к начальному значению `z` и ко всем остальным элементам коллекции слева направо. Ниже приведен пример его использования.
40
+
{% endtab %}
33
41
34
-
Начиная с начального значения 0, `foldLeft` применяет функцию `(m, n) => m + n` к каждому элементу списка и предыдущему накопленному значению.
42
+
{% endtabs %}
35
43
36
-
```scala mdoc:nest
44
+
`foldLeft` применяет бинарный оператор `op` к начальному значению `z` и ко всем остальным элементам коллекции слева направо.
45
+
Ниже приведен пример его использования.
46
+
47
+
Начиная с начального значения `0`, `foldLeft` применяет функцию `(m, n) => m + n` к каждому элементу списка
48
+
и предыдущему накопленному значению.
49
+
50
+
{% tabs foldLeft_use %}
51
+
52
+
{% tab 'Scala 2 и 3' for=foldLeft_use %}
53
+
54
+
```scala mdoc
37
55
valnumbers=List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
38
56
valres= numbers.foldLeft(0)((m, n) => m + n)
39
-
print(res) // 55
57
+
println(res) // 55
40
58
```
41
59
42
-
Множественные списки параметров имеют избыточный синтаксис, поэтому их следует использовать экономно. Можем предложить следующие варианты для использования множественных списков (каррирования):
60
+
{% endtab %}
43
61
44
-
#### Отдельный функциональный параметр
45
-
Функцию `op` можно выделить в отдельный функциональный параметр у `foldLeft`, благодаря такому выделению становится возможен более элегантный стиль передачи анонимной функции в метод. Без такого выделения код выглядел бы следующим образом:
46
-
```scala
47
-
numbers.foldLeft(0, {(m: Int, n: Int) => m + n})
62
+
{% endtabs %}
63
+
64
+
### Варианты для использования
65
+
66
+
Предлагаемые варианты для использования множественных списков параметров включают:
67
+
68
+
#### Вывод типа
69
+
70
+
Исторически сложилось, что в Scala вывод типов происходит по одному списку параметров за раз.
71
+
Скажем, у вас есть следующий метод:
72
+
73
+
{% tabs foldLeft1_definition %}
74
+
75
+
{% tab 'Scala 2 и 3' for=foldLeft1_definition %}
76
+
77
+
```scala mdoc
78
+
deffoldLeft1[A, B](as: List[A], b0: B, op: (B, A) =>B) =???
79
+
```
80
+
81
+
{% endtab %}
82
+
83
+
{% endtabs %}
84
+
85
+
Затем при желании вызвать его следующим образом, можно обнаружить, что метод не компилируется:
86
+
87
+
{% tabs foldLeft1_wrong_use %}
88
+
89
+
{% tab 'Scala 2 и 3' for=foldLeft1_wrong_use %}
90
+
91
+
```scala mdoc:fail
92
+
defnotPossible= foldLeft1(numbers, 0, _ + _)
48
93
```
49
-
50
-
Обратите внимание, что использование отдельного функционального параметра позволяет нам использовать автоматическое выведение типа для него, что делает код еще более кратким, это было бы невозможно без каррирования.
51
-
94
+
95
+
{% endtab %}
96
+
97
+
{% endtabs %}
98
+
99
+
вам нужно будет вызвать его одним из следующих способов:
defsecondWay= foldLeft1(numbers, 0, (a: Int, b: Int) => a + b)
54
108
```
55
-
Если в утверждении `numbers.foldLeft(0)(_ + _)` зафиксировать отдельный параметр `z`, мы получим частично определенную функцию, которую можно переиспользовать, как показано ниже:
56
-
```scala mdoc:nest
57
-
valnumbers=List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
58
-
valnumberFunc= numbers.foldLeft(List[Int]())_ // z = Empty.List[Int]
Методы могут объявляться с несколькими списками параметров.
163
+
При этом когда такой метод вызывается с меньшим количеством списков параметров,
164
+
это приводит к созданию новой функции,
165
+
которая ожидает на вход недостающий список параметров.
166
+
Формально это называется [частичное применение](https://ru.wikipedia.org/wiki/%D0%A7%D0%B0%D1%81%D1%82%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5).
167
+
168
+
Например,
169
+
170
+
{% tabs foldLeft_partial %}
171
+
172
+
{% tab 'Scala 2 и 3' for=foldLeft_partial %}
173
+
68
174
```scala mdoc:nest
69
175
valnumbers=List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
176
+
valnumberFunc= numbers.foldLeft(List[Int]()) _
70
177
71
-
numbers.foldLeft(0)((sum, item) =>sum + item) // Общая Форма
72
-
numbers.foldRight(0)((sum, item) => sum + item) // Общая Форма
Иногда можно встретить, что метод с несколькими списками параметров называется «каррированный».
192
+
193
+
Как говорится [в статье на Википедии о каррировании](https://ru.wikipedia.org/wiki/%D0%9A%D0%B0%D1%80%D1%80%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5),
194
+
195
+
> Каррирование — преобразование функции от многих аргументов в набор вложенных функций,
196
+
> каждая из которых является функцией от одного аргумента.
197
+
198
+
Мы не рекомендуем использовать слово «каррирование» в отношении множественных списков параметров Scala по двум причинам:
199
+
200
+
1. В Scala множественные параметры и множественные списки параметров задаются
201
+
и реализуются непосредственно как часть языка, а не преобразуются из функций с одним параметром.
202
+
203
+
2. Существует опасность путаницы с методами из стандартной Scala библиотеки
0 commit comments