Skip to content

Commit 0dddcb7

Browse files
committed
Adress review comments with changed docs and new tests
1 parent 4f28d8a commit 0dddcb7

File tree

6 files changed

+64
-4
lines changed

6 files changed

+64
-4
lines changed

docs/_docs/reference/experimental/typeclasses.md

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
21
---
32
layout: doc-page
4-
title: "Type Classes"
3+
title: "Better Support for Type Classes"
54
nightlyOf: https://docs.scala-lang.org/scala3/reference/experimental/typeclasses.html
65
---
76

8-
# Some Proposed Changes for Better Support of Type Classes
9-
107
Martin Odersky, 8.1.2024, edited 5.4.2024
118

129
A type class in Scala is a pattern where we define

tests/neg/deferred-givens-2.check

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
-- [E172] Type Error: tests/neg/deferred-givens-2.scala:17:6 -----------------------------------------------------------
2+
17 |class SortedIntWrong1 extends Sorted: // error
3+
|^
4+
|No given instance of type Ord{type Self = SortedIntWrong1.this.Element} was found for inferring the implementation of the deferred given instance given_Ord_Element in trait Sorted
5+
18 | type Element = Int
6+
19 | override given (Element is Ord)()
7+
-- [E172] Type Error: tests/neg/deferred-givens-2.scala:21:6 -----------------------------------------------------------
8+
21 |class SortedIntWrong2 extends Sorted: // error
9+
|^
10+
|No given instance of type Ord{type Self = SortedIntWrong2.this.Element} was found for inferring the implementation of the deferred given instance given_Ord_Element in trait Sorted
11+
22 | type Element = Int
12+
23 | override given (Int is Ord)()

tests/neg/deferred-givens-2.scala

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//> using options -language:experimental.modularity -source future
2+
trait Ord:
3+
type Self
4+
5+
trait Sorted:
6+
type Element: Ord
7+
8+
object Scoped:
9+
given (Int is Ord)()
10+
class SortedIntCorrect extends Sorted:
11+
type Element = Int
12+
13+
class SortedIntCorrect2 extends Sorted:
14+
type Element = Int
15+
override given (Int is Ord)() as given_Ord_Element
16+
17+
class SortedIntWrong1 extends Sorted: // error
18+
type Element = Int
19+
override given (Element is Ord)()
20+
21+
class SortedIntWrong2 extends Sorted: // error
22+
type Element = Int
23+
override given (Int is Ord)()
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
def f[S: Monad](
2+
initial: S.Self = S.unit // error
3+
) =
4+
S.unit // works
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
//> using options -Xprint:typer -language:experimental.modularity -source future
2+
3+
def f1[S, T <: S : Singleton](x: S) = ()
4+
def f2[S, T >: S : Singleton](x: S) = ()
5+
6+
def Test =
7+
f1(42) // f1[Int, Singleton & Int] // should infer (42 : Int) or throw an error?
8+
f2(42) // f2[(42 : Int), (42 : Int)]

tests/pos/cbproxy-expansion.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//> using options -language:experimental.modularity -source future
2+
trait TC[T]:
3+
type Self
4+
5+
def f1[S, T: TC[S] as tc](x: S, y: tc.Self) = ()
6+
def f2[S, T: TC[S]](x: S, y: T.Self) = ()
7+
def f3[S, T: TC[S]](x: S, y: Int) = ()
8+
9+
given TC[String] with
10+
type Self = Int
11+
def unit = 42
12+
13+
def main =
14+
f1("hello", 23)
15+
f2("hello", 23)
16+
f3("hello", 23)

0 commit comments

Comments
 (0)