11object Test extends App {
22
3- trait Nat
3+ trait Nat {
4+ def toInt : Int
5+ }
6+
7+ case object Z extends Nat {
8+ transparent def toInt = 0
9+ }
410
5- case object Z extends Nat
611 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+ }
815
916 abstract class HasResult [T ] { type Result = T }
1017 case class ToNat [+ T ](val value : T ) extends HasResult [T ]
@@ -13,7 +20,7 @@ object Test extends App {
1320 if n == 0 then new ToNat (Z )
1421 else {
1522 val n1 = ToNat (n - 1 )
16- new ToNat [ S [n1. Result ]] (S (n1.value))
23+ new ToNat (S (n1.value))
1724 }
1825
1926 val x0 = ToNat (0 )
@@ -28,6 +35,10 @@ object Test extends App {
2835 println(x0)
2936 println(x1)
3037 println(x2)
38+ transparent val i0 = y0.toInt
39+ val j0 : 0 = i0
40+ transparent val i2 = y2.toInt
41+ val j2 : 2 = i2
3142
3243 trait HList {
3344 def isEmpty : Boolean
@@ -41,7 +52,7 @@ object Test extends App {
4152 override def tail : Nothing = ???
4253 }
4354
44- case object HNil extends HNil
55+ lazy val HNil : HNil = new HNil
4556
4657 case class HCons [H , T <: HList ](hd : H , tl : T ) extends HList {
4758 transparent override def isEmpty = false
@@ -61,6 +72,38 @@ object Test extends App {
6172 val r3 = concat(xs, xs)
6273
6374 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 )
6576 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+ */
66109}
0 commit comments