10. Here’s what you
can do in Scala
scala> val x = "panda!"
x: String = panda!
scala> val t: x.type = x
t: x.type = panda!
scala> final val k = "panda!"
k: String("panda!") = panda!
11. Here’s what you
cannot
scala> val t: "panda!".type = "panda!"
<console>:1: error: identifier expected
but string literal found.
val t: "panda!".type = "panda!"
^
12. scala> val t: "panda!".type = "panda!"
t: "panda!".type = panda!
With 42.type
13. scala> val x = 42
x: Int = 42
scala> val t: x.type = 42
<console>:8: error: type mismatch;
found : x.type (with underlying type Int)
required: AnyRef
val t: x.type = 42
^
scala> val workaround = Witness(42)
workaround: shapeless.Witness{type T = Int(42)} = fresh$macro$3$1@35b45d3f
scala> val t: workaround.T = 42
t: workaround.T = 42
Even more
14. scala> val t: 42.type = 42
t: 42.type = 42
scala> val t: 42 = 42
t: 42.type = 42
Or even
Solution with 42.type
15. SimpleType ::= Path ‘.’ type
A singleton type is of the form p.type,
where p is a path pointing to a value
expected to conform to scala.AnyRef.
Before
21. State of deptypes Scala
“Scala vs Idris: Dependent
Types, Now and in the Future”*
*Edwin Brady & Miles Sabin, Strange Loop 2013
22. How can we
make it better?
Well, we can try.
Scala + SMT-solver
23. You would do way better to implement the
[typechecking] logic completely externally to the
compiler and use it as a black box from the
compiler, then you might have a chance.
30. val magic: ((x: Int) => x > 23 && x < 42).type = 30
val x: 42 = 42 val x: ((x: Int) => x == 42).type = 42
31. val x: 42 = 42 val x: ((x: Int) => x == 42).type = 42
val x: Int = 42 val x: ((x: Int) => true).type = 42
val magic: ((x: Int) => x > 23 && x < 42).type = 30
36. this thing would not be possible without:
@xeno_by, @adriaanm, @retronym,
and initial impl by @paulp
Scala Z3 bindings: LARA@EPFL
Z3: Microsoft research
slides, illustrations: @killnicole
Credits: