Skip to content

Commit 901f152

Browse files
authored
Merge pull request scala#1241 from kamilduda/tour/pl/multiple-parameter-lists
Polish translation of Tour of Scala: Multiple parameter lists
2 parents f097970 + 3ca8346 commit 901f152

File tree

2 files changed

+60
-18
lines changed

2 files changed

+60
-18
lines changed

_pl/tour/multiple-parameter-lists.md

+57-17
Original file line numberDiff line numberDiff line change
@@ -6,37 +6,77 @@ discourse: false
66

77
partof: scala-tour
88

9-
num: 9
9+
num: 10
1010
language: pl
1111
next-page: case-classes
1212
previous-page: nested-functions
1313
---
1414

15-
Funkcja może określić dowolną ilość list parametrów. Kiedy jest ona wywołana dla mniejszej liczby niż zostało to zdefiniowane, zwraca funkcję pobierającą dalsze listy parametrów jako jej argument.
15+
Metoda może określać dowolną liczbę list parametrów.
16+
W sytuacji, kiedy jest ona wywołana dla mniejszej liczby list parametrów niż zostało to zdefiniowane, zwracana jest funkcja oczekująca pozostałych list parametrów jako argumentów.
1617

17-
Przykład rozwijania funkcji:
18+
Dla przykładu przyjrzyjmy się metodzie `foldLeft` zdefiniowanej w [Traversable](/overviews/collections/trait-traversable.html) z kolekcji w Scali:
1819

20+
```
21+
def foldLeft[B](z: B)(op: (B, A) => B): B
22+
```
23+
24+
Metoda `foldLeft` stosuje binarny operator `op` na wartości początkowej `z` oraz wszystkich elementach zawartych w aktualnym obiekcie `Traversable` - idąc od lewej do prawej strony.
25+
Poniżej omówiony jest przykład użycia.
26+
27+
Zaczynając od początkowej wartości 0, funkcja `foldLeft` stosuje funkcję `(m, n) => m + n` na każdym elemencie listy oraz poprzedniej zakumulowanej wartości.
28+
29+
{% scalafiddle %}
1930
```tut
20-
object CurryTest extends App {
31+
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
32+
val res = numbers.foldLeft(0)((m, n) => m + n)
33+
println(res) // 55
34+
```
35+
{% endscalafiddle %}
36+
37+
Metody z wieloma listami parametrów mają bardziej dosadną składnię wywoływania, dlatego powinny być używane oszczędnie.
38+
Sugerowane przypadki użycia obejmują:
39+
40+
#### Funkcja jako pojedynczy parametr
2141

22-
def filter(xs: List[Int], p: Int => Boolean): List[Int] =
23-
if (xs.isEmpty) xs
24-
else if (p(xs.head)) xs.head :: filter(xs.tail, p)
25-
else filter(xs.tail, p)
42+
W przypadku funkcji jako pojedynczego parametru, tak jak w przypadku `op` z `foldLeft` powyżej, wiele list parametrów pozwala na bardziej zwięzłą składnię przy przekazywaniu funkcji anonimowej do metody.
43+
Bez wielu list parametrów kod wyglądałby w następujący sposób:
44+
45+
```
46+
numbers.foldLeft(0, {(m: Int, n: Int) => m + n})
47+
```
2648

27-
def modN(n: Int)(x: Int) = ((x % n) == 0)
49+
Zauważ, że użycie wielu list parametrów pozwala na wykorzystanie wnioskowania typów, co z kolei czyni kod bardziej zwięzłym (jak pokazano poniżej).
50+
Używając standardowej definicji metody, nie byłoby to możliwe.
2851

29-
val nums = List(1, 2, 3, 4, 5, 6, 7, 8)
30-
println(filter(nums, modN(2)))
31-
println(filter(nums, modN(3)))
32-
}
52+
```
53+
numbers.foldLeft(0)(_ + _)
3354
```
3455

35-
_Uwaga: metoda `modN` jest częściowo zastosowana dla dwóch wywołań `filter`, gdyż jest wywołana tylko dla jej pierwszego argumentu. Wyrażenie `modN(2)` zwraca funkcję typu `Int => Boolean` - stąd też może być przekazane jako drugi argument funkcji `filter`._
56+
Powyższe wyrażenie `numbers.foldLeft(0)(_ + _)` pozwala trwale ustawić parametr `z` i przekazywać dalej częściową funkcję (partial function), tak jak pokazano to poniżej:
3657

37-
Wynik działania powyższego programu:
58+
```tut
59+
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
60+
val numberFunc = numbers.foldLeft(List[Int]())_
3861
62+
val squares = numberFunc((xs, x) => xs:+ x*x)
63+
print(squares.toString()) // List(1, 4, 9, 16, 25, 36, 49, 64, 81, 100)
64+
65+
val cubes = numberFunc((xs, x) => xs:+ x*x*x)
66+
print(cubes.toString()) // List(1, 8, 27, 64, 125, 216, 343, 512, 729, 1000)
3967
```
40-
List(2,4,6,8)
41-
List(3,6)
68+
69+
Podsumowując, `foldLeft` oraz `foldRight` mogą być używane w dowolnej z poniższych postaci:
70+
71+
```tut
72+
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
73+
74+
numbers.foldLeft(0)((sum, item) => sum + item) // postać ogólna
75+
numbers.foldRight(0)((sum, item) => sum + item) // postać ogólna
76+
77+
numbers.foldLeft(0)(_+_) // postać rozwijana (curried)
78+
numbers.foldRight(0)(_+_) // postać rozwijana (curried)
79+
80+
(0 /: numbers)(_+_) // Alternatywy sposób wywołania foldLeft
81+
(numbers :\ 0)(_+_) // Alternatywy sposób wywołania foldRight
4282
```

_tour/multiple-parameter-lists.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,13 @@ def foldLeft[B](z: B)(op: (B, A) => B): B
2525

2626
Starting with an initial value of 0, `foldLeft` here applies the function `(m, n) => m + n` to each element in the List and the previous accumulated value.
2727

28+
{% scalafiddle %}
2829
```tut
2930
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
3031
val res = numbers.foldLeft(0)((m, n) => m + n)
31-
print(res) // 55
32+
println(res) // 55
3233
```
34+
{% endscalafiddle %}
3335

3436
Multiple parameter lists have a more verbose invocation syntax; and hence should be used sparingly. Suggested use cases include:
3537

0 commit comments

Comments
 (0)