Upgrade to Pro — share decks privately, control downloads, hide ads and more …

42: Rise of the dependent types

42: Rise of the dependent types

George Leontiev

December 09, 2014
Tweet

More Decks by George Leontiev

Other Decks in Technology

Transcript

  1. About me: @folone likes types* *same reasons why @propensive does

    in his “Batshit crazy algebra with types” talk
  2. 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!
  3. 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!" ^
  4. 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
  5. 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
  6. 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
  7. State of deptypes Scala “Scala vs Idris: Dependent Types, Now

    and in the Future”* *Edwin Brady & Miles Sabin, Strange Loop 2013
  8. 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.
  9. scala> findAll((x: Val[Int]) => x > 23 && x <

    42).toList res0: List[Int] = List(24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41)
  10. val magic: ((x: Int) => x > 23 && x

    < 42).type = 30 val x: 42 = 42 val x: ((x: Int) => x == 42).type = 42
  11. 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
  12. 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: