Skip to content

Instantly share code, notes, and snippets.

@marcoonroad
Last active February 23, 2017 04:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save marcoonroad/8a7c654349dae34964b8ed5bae2537ef to your computer and use it in GitHub Desktop.
Save marcoonroad/8a7c654349dae34964b8ed5bae2537ef to your computer and use it in GitHub Desktop.
"Sound" minimal Gradual Typing in Scala through Implicits...
import scala.language.implicitConversions
class Unknown (value : Any) {
def coercion[ Type ] : Type =
value.asInstanceOf[ Type ]
}
implicit def promotion[ Type ] (value : Type) : Unknown =
new Unknown (value)
implicit def downcast[ Type ] (value : Unknown) : Type =
value.coercion[ Type ]
// end
λ(bash). scala -feature -i Gradual.scala
Loading Gradual.scala...
import scala.language.implicitConversions
defined class Unknown
promotion: [Type](value: Type)Unknown
downcast: [Type](value: Unknown)Type
Welcome to Scala 2.11.8 (Java HotSpot(TM) Server VM, Java 1.6.0_30).
Type in expressions for evaluation. Or try :help.
scala> val x : Unknown = 5
x: Unknown = Unknown@1a2d3be
scala> val y : Int = x // OK, Unknown ~~ Int
y: Int = 5
scala> val z : String = x // OK, Unknown ~~ String
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
... 32 elided
scala> val a : String = y // OK, (String ~/~ Int)
<console>:17: error: type mismatch;
found : Int
required: String
val a : String = y
^
scala> import scala.language.implicitConversions
import scala.language.implicitConversions
scala> implicit def cast[ Type ] (implicit value : Any) : Type = value.asInstanceOf[ Type ]
cast: [Type](implicit value: Any)Type
scala> val b : Any = 7 // OK, Int <: Any
b: Any = 7
scala> val c : Int = b // OK, implicit cast : Any => Type where Type := Int
c: Int = 7
scala> val d : String = b // OK, implicit cast : Any => Type where Type := Int
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
... 32 elided
scala> val e : String = c // NOT OK, implicit cast : (Int <: Any) => Type where Type := String, so Int => String
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
... 32 elided
scala>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment