38
@folone @xeno_by @adriaanm @retronym @extempore2

42: Rise of the dependent types

Embed Size (px)

Citation preview

@folone @xeno_by @adriaanm @retronym @extempore2

About me: @folone likes types*

*same reasons why @propensive does in his “Batshit crazy algebra with types” talk

12 hours of audio every minute 300 million people every month

Stop… Hackertime!

42.type$ git clone [email protected]:folone/scala.git -b scalaexchange

$ ant publish-local-opt -Dmaven.version.suffix="-typelevel"

1. Ranged

2. Residue

3. Records

Consistency

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!

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!"

^

scala> val t: "panda!".type = "panda!"

t: "panda!".type = panda!

With 42.type

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

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

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

After

| Literal [‘.’ type]

SimpleType ::= Path ‘.’ type

History

QuizLiteral-based singleton types in scala have seen

their first implementation in:

2013 2011 2008 2004

http://existentialtype.net/2008/07/21/literally-dependent-types/

QuizLiteral-based singleton types in scala have seen

their first implementation in:

2013 2011 2008 2004

State of deptypes Scala “Scala vs Idris: Dependent

Types, Now and in the Future”*

*Edwin Brady & Miles Sabin, Strange Loop 2013

How can we make it better? Well, we can try.

Scala + SMT-solver

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.

scala> import z3.scala._, z3.scala.dsl._

import z3.scala._

import z3.scala.dsl._

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)

((x: Val[Int]) => x > 23 && x < 42)

((x: Int) => x > 23 && x < 42)

((x: Int) => x > 23 && x < 42).type

val magic: ((x: Int) => x > 23 && x < 42).type = 30

val magic: ((x: Int) => x > 23 && x < 42).type = 30

val x: 42 = 42 val x: ((x: Int) => x == 42).type = 42

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

But

<:

((x: Int) => x > 10).type

((x: Int) => x > 23).typeis

Liquid Types

Logically qualified Types

bit.ly/42_type

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: