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
- remove tag “Scala 3 only”
- add a link to the page that explains context parameters and inferred terms
- remove paragraph that shows anonymous context parameters
- fix link to the FAQ
- also cross-write the FAQ entry
description: This page demonstrates Context Bounds in Scala 3.
4
+
description: This page demonstrates Context Bounds in Scala.
5
5
languages: [zh-cn]
6
6
num: 61
7
7
previous-page: ca-given-using-clauses
8
8
next-page: ca-given-imports
9
9
---
10
-
<spanclass="tag tag-inline">Scala 3 only</span>
11
10
12
-
13
-
{% comment %}
14
-
- TODO: define "context parameter"
15
-
- TODO: define "synthesized" and "synthesized arguments"
16
-
{% endcomment %}
17
-
18
-
In many situations the name of a _context parameter_ doesn’t have to be mentioned explicitly, since it’s only used by the compiler in synthesized arguments for other context parameters.
11
+
In many situations the name of a [context parameter]({% link _overviews/scala3-book/ca-given-using-clauses.md %}#using-clauses) doesn’t have to be mentioned explicitly, since it’s only used by the compiler in synthesized arguments for other context parameters.
19
12
In that case you don’t have to define a parameter name, and can just provide the parameter type.
20
13
21
14
22
15
## Background
23
16
24
17
For example, this `maximum` method takes a _context parameter_ of type `Ord`, only to pass it on as an argument to `max`:
In that code the parameter name `ord` isn’t actually required; it can be passed on as an inferred argument to `max`, so you just state that `maximum` uses the type `Ord[A]` without giving it a name:
40
-
41
-
{% tabs context-bounds-no-param-name %}
42
-
43
-
{% tab 'Scala 3 Only' %}
44
-
28
+
{% tab 'Scala 3' %}
45
29
```scala
46
-
defmaximum[A](xs: List[A])(usingOrd[A]):A=
47
-
xs.reduceLeft(max)
30
+
defmaximum[A](xs: List[A])(usingord: Ord[A]):A=
31
+
xs.reduceLeft(max(ord))
48
32
```
49
-
50
33
{% endtab %}
51
34
52
35
{% endtabs %}
53
36
54
-
55
37
## Context bounds
56
38
57
-
Given that background, a _context bound_ is a shorthand syntax for expressing the pattern of, “a context parameter that depends on a type parameter.”
39
+
Given that background, a _context bound_ is a shorthand syntax for expressing the pattern of, “a context parameter applied to a type parameter.”
58
40
59
41
Using a context bound, the `maximum` method can be written like this:
A bound like `: Ord` on a type parameter `A` of a method or class indicates a context parameter with `Ord[A]`.
56
+
A bound like `: Ord` on a type parameter `A` of a method or class indicates a context parameter with type `Ord[A]`.
57
+
Under the hood, the compiler transforms this syntax into the one shown in the Background section.
75
58
76
-
For more information about context bounds, see the [“What are context bounds?”](https://docs.scala-lang.org/tutorials/FAQ/context-bounds.html) section of the Scala FAQ.
59
+
For more information about context bounds, see the [“What are context bounds?”]({% link _overviews/FAQ/index.md %}#what-are-context-bounds) section of the Scala FAQ.
By starting a parameter section with the keyword `using`, we tell the Scala compiler that at the callsite it should automatically find an argument with the correct type.
66
+
By starting a parameter section with the keyword `using`, we tell the Scala compiler that at the call-site it should automatically find an argument with the correct type.
67
67
The Scala compiler thus performs **term inference**.
68
68
69
69
In our call to `renderWidget(List("cart"))` the Scala compiler will see that there is a term of type `Config` in scope (the `c`) and automatically provide it to `renderWidget`.
0 commit comments