1
1
object Test extends App {
2
2
3
- trait Nat
3
+ trait Nat {
4
+ def toInt : Int
5
+ }
6
+
7
+ case object Z extends Nat {
8
+ transparent def toInt = 0
9
+ }
4
10
5
- case object Z extends Nat
6
11
type Z = Z .type
7
- case class S [N <: Nat ](n : Nat ) extends Nat
12
+ case class S [N <: Nat ](n : N ) extends Nat {
13
+ transparent def toInt = n.toInt + 1
14
+ }
8
15
9
16
abstract class HasResult [T ] { type Result = T }
10
17
case class ToNat [+ T ](val value : T ) extends HasResult [T ]
@@ -13,7 +20,7 @@ object Test extends App {
13
20
if n == 0 then new ToNat (Z )
14
21
else {
15
22
val n1 = ToNat (n - 1 )
16
- new ToNat [ S [n1. Result ]] (S (n1.value))
23
+ new ToNat (S (n1.value))
17
24
}
18
25
19
26
val x0 = ToNat (0 )
@@ -28,6 +35,10 @@ object Test extends App {
28
35
println(x0)
29
36
println(x1)
30
37
println(x2)
38
+ transparent val i0 = y0.toInt
39
+ val j0 : 0 = i0
40
+ transparent val i2 = y2.toInt
41
+ val j2 : 2 = i2
31
42
32
43
trait HList {
33
44
def isEmpty : Boolean
@@ -41,7 +52,7 @@ object Test extends App {
41
52
override def tail : Nothing = ???
42
53
}
43
54
44
- case object HNil extends HNil
55
+ lazy val HNil : HNil = new HNil
45
56
46
57
case class HCons [H , T <: HList ](hd : H , tl : T ) extends HList {
47
58
transparent override def isEmpty = false
@@ -61,6 +72,38 @@ object Test extends App {
61
72
val r3 = concat(xs, xs)
62
73
63
74
val r4 = concat(HNil , HCons (1 , HCons (" a" , HNil )))
64
- val r5 = concat(HCons (1 , HCons (" a" , HNil )), HNil )
75
+ val r5 = concat(HCons (1 , HCons (" a" , HNil )) , HNil )
65
76
val r6 = concat(HCons (1 , HCons (" a" , HNil )), HCons (1 , HCons (" a" , HNil )))
77
+
78
+ transparent def size (xs : HList ): Nat =
79
+ if (xs.isEmpty) Z
80
+ else S (size(xs.tail))
81
+
82
+ val s0 = size(HNil )
83
+ val s1 = size(xs)
84
+
85
+ transparent def index (xs : HList , inline idx : Int ): Any =
86
+ if (idx == 0 ) xs.head
87
+ else index(xs.tail, idx - 1 )
88
+
89
+ val s2 = index(xs, 0 )
90
+ val ss2 : Int = s2
91
+ val s3 = index(xs, 1 )
92
+ var ss3 : String = s3
93
+ def s4 = index(xs, 2 )
94
+ def ss4 : Nothing = s4
95
+
96
+ /** Does not work yet:
97
+
98
+ implicit class HListDeco(xs: HList) {
99
+ transparent def ++ (ys: HList) = concat(xs, ys)
100
+ }
101
+
102
+ val rr0 = HNil ++ HNil
103
+ val rr1 = HNil ++ xs
104
+ val rr2 = xs ++ HNil
105
+ val rr3 = xs ++ xs
106
+ val rr3a: HCons[Int, HCons[String, HCons[Int, HCons[String, HNil]]]] = rr3
107
+
108
+ */
66
109
}
0 commit comments