Implicits Inspected and Explained @ ScalaDays 2016 Berlin

118
Implicits Inspected and Explained ScalaDays 2016 Berlin Tim Soethout - ING Bank http://blog.timmybankers.nl

Transcript of Implicits Inspected and Explained @ ScalaDays 2016 Berlin

ImplicitsInspectedand

ExplainedScalaDays2016Berlin

TimSoethout-INGBank

http://blog.timmybankers.nl

ImplicitsInspectedand

ExplainedScalaDays2016Berlin

TimSoethout-INGBank

Outline:Introduction-Implicits-Resolving-TypeClasses-Wrapup

http://blog.timmybankers.nl

Aboutmyself

TimSoethout

Functionalprogrammeratheart

Scala/FPevangelist/trainerinsideINGBank

PhDCandidate

What?

Usevalueswithoutexplicitreference

OO:isa+hasa

Implicitsadd:isviewableasa

LooseCoupling,TightCohesion

Examples

Akka

Futures

trait ScalaActorRef def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = ...}

actorRef ! SomeMessage("text")

object Future { def apply[T](body: =>T)(implicit executor: ExecutionContext): Future[T] = ...}

Future { doExpensiveComputation()}

Examples(2)

Collections

trait TraversableOnce[+A] { def sum[B >: A](implicit num: Numeric[B]): B = ...}

List(1,2,3).sumres0: Int = 6

Examples(3)

Finagle

@implicitNotFound("Builder is not fully configured: Cluster: ${HasCluster}, Codec: ${HasCodec}, HostConnectionLimit: ${HasHostConnectionLimit}")private[builder] trait ClientConfigEvidence[HasCluster, HasCodec, HasHostConnectionLimit]

class ClientBuilder[Req, Rep, HasCluster, HasCodec, HasHostConnectionLimit] private[finagle](...) { def build()( implicit THE_BUILDER_IS_NOT_FULLY_SPECIFIED_SEE_ClientBuilder_DOCUMENTATION: ClientConfigEvidence[HasCluster, HasCodec, HasHostConnectionLimit] ): Service[Req, Rep] = ...}

val builder: ClientBuilder[Request, Response, Yes, Yes, Nothing] = ClientBuilder() .codec(Http()) .hosts("twitter.com:80")

builder.build()

Error:(24, 15) Builder is not fully configured: Cluster: com.twitter.finagle.builder.ClientConfig.Yes, Codec: com.twitter.finagle.builder.ClientConfig.Yes, HostConnectionLimit: Nothingbuilder.build() ^

Implicitsenable

DSLs

Typeevidence

Reduceverbosity

Typeclasses

DependencyInjectionatCompiletime

Extendinglibraries

Butbeware

Resolutionrulescanbedifficult

Automaticconversions

Donotoveruse

Demo

Implicitconversions(a.k.a.Implicitviews)

Implicitparameters

Implicitclasses

Implicitdeclarations

implicit def a2B(a : A) : B = ...

def method(implicit x : Int) = ...

implicit class X(y: Int)

implicit val x = ...

Scoping

OderskyExplains

Lookupprecedence:

1. Bynameonly,withoutanyprefix

2. In"implicitscope":

companion/packageobjectof

thesourcetype

itsparameters+supertypeandsupertraits

Demo

Scopingandresolving

Typeclassuses

Ad-hocpolymorphism

Extensionoflibraries

trait Numeric[T] extends Ordering[T] { def plus(x: T, y: T): T def minus(x: T, y: T): T def times(x: T, y: T): T ...}

Demo

TypeclassforJSONSerialisation

Naivewithsubtyping

Typeclass+improvements

Recap

Implicitsarepowerful

Becarefulwithconversions

Implicitprecedence:firstlooklocal,thenincompanion/packageobject

Typeclassestoextendlibraries

Recap

Implicitsarepowerful

Becarefulwithconversions

Implicitprecedence:firstlooklocal,thenincompanion/packageobject

Typeclassestoextendlibraries

Questions?