Skip to content

Commit 0e8a518

Browse files
Add test from i7586
1 parent bb4d4e2 commit 0e8a518

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

tests/pos/i7586.scala

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
sealed trait Nat
3+
case object Z extends Nat
4+
case class S[N <: Nat](pred: N) extends Nat
5+
type Z = Z.type
6+
7+
given [N <: Nat](using n: N): S[N] = S(n)
8+
given zero: Z = Z
9+
10+
case class Sum[N <: Nat, M <: Nat, R <: Nat](r: R)
11+
12+
given [N <: Nat](using n: N): Sum[Z, N, N] = Sum(n)
13+
given [N <: Nat, M <: Nat, R <: Nat](
14+
using sum: Sum[N, M, R]
15+
): Sum[S[N], M, S[R]] = Sum(S(sum.r))
16+
17+
def add[N <: Nat, M <: Nat, R <: Nat](n: N, m: M)(using sum: Sum[N, M, R]): R = sum.r
18+
*/
19+
20+
21+
trait Nat
22+
case object Z extends Nat
23+
case class S[N <: Nat](pred: N) extends Nat
24+
25+
type Z = Z.type
26+
given zero: Z = Z
27+
given succ[N <: Nat](using n: N): S[N] = S(n)
28+
29+
case class Sum[N <: Nat, M <: Nat, R <: Nat](result: R)
30+
31+
given sumZ[N <: Nat](using n: N): Sum[Z, N, N] = Sum(n)
32+
given sumS[N <: Nat, M <: Nat, R <: Nat](
33+
using sum: Sum[N, M, R]
34+
): Sum[S[N], M, S[R]] = Sum(S(sum.result))
35+
36+
def add[N <: Nat, M <: Nat, R <: Nat](n: N, m: M)(
37+
using sum: Sum[N, M, R]
38+
): R = sum.result
39+
40+
case class Prod[N <: Nat, M <: Nat, R <: Nat](result: R)
41+
42+
43+
@main def Test: Unit =
44+
45+
val n1 = add(Z, S(Z))
46+
summon[n1.type <:< S[Z]]
47+
48+
val n3 = add(S(S(Z)), S(Z))
49+
summon[n3.type <:< S[S[S[Z]]]]
50+
51+
val n3_2 = add(S(Z), S(S(Z)))
52+
summon[n3_2.type <:< S[S[S[Z]]]]
53+
54+

0 commit comments

Comments
 (0)