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
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
10
11
-
12
-
{% comment %}
13
-
- TODO: define "context parameter"
14
-
- TODO: define "synthesized" and "synthesized arguments"
15
-
{% endcomment %}
16
-
17
-
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.
18
12
In that case you don’t have to define a parameter name, and can just provide the parameter type.
19
13
20
14
21
15
## Background
22
16
23
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:
31
-
28
+
{% tab 'Scala 3' %}
32
29
```scala
33
-
defmaximum[A](xs: List[A])(usingOrd[A]):A=
34
-
xs.reduceLeft(max)
30
+
defmaximum[A](xs: List[A])(usingord: Ord[A]):A=
31
+
xs.reduceLeft(max(using ord))
35
32
```
33
+
{% endtab %}
36
34
35
+
{% endtabs %}
37
36
38
37
## Context bounds
39
38
40
-
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.”
41
40
42
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]`.
52
+
{% endtab %}
53
+
54
+
{% endtabs %}
55
+
56
+
57
+
A bound like `: Ord` on a type parameter `A` of a method or class indicates a context parameter with type `Ord[A]`.
58
+
Under the hood, the compiler transforms this syntax into the one shown in the Background section.
49
59
50
-
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.
60
+
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`.
Copy file name to clipboardExpand all lines: _overviews/scala3-book/ca-multiversal-equality.md
+4Lines changed: 4 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,7 +7,11 @@ num: 64
7
7
previous-page: ca-type-classes
8
8
next-page: ca-implicit-conversions
9
9
---
10
+
<spanclass="tag tag-inline">New In Scala 3</span>
10
11
12
+
> Multiversal Equality is a new language feature that was introduced in Scala 3.
13
+
> Because it has no equivalent in Scala 2, all code examples
14
+
> in this lesson assume you are using Scala 3.
11
15
12
16
Previously, Scala had *universal equality*: Two values of any types could be compared with each other using `==` and `!=`.
13
17
This came from the fact that `==` and `!=` are implemented in terms of Java’s `equals` method, which can also compare values of any two reference types.
0 commit comments