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

Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Jan 22, 2017

Download

Software

Tim Soethout
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

ImplicitsInspectedand

ExplainedScalaDays2016Berlin

TimSoethout-INGBank

http://blog.timmybankers.nl

Page 2: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

ImplicitsInspectedand

ExplainedScalaDays2016Berlin

TimSoethout-INGBank

Outline:Introduction-Implicits-Resolving-TypeClasses-Wrapup

http://blog.timmybankers.nl

Page 3: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Aboutmyself

TimSoethout

Functionalprogrammeratheart

Scala/FPevangelist/trainerinsideINGBank

PhDCandidate

Page 4: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 5: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

What?

Usevalueswithoutexplicitreference

OO:isa+hasa

Implicitsadd:isviewableasa

LooseCoupling,TightCohesion

Page 6: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

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()}

Page 7: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Examples(2)

Collections

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

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

Page 8: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

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() ^

Page 9: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Implicitsenable

DSLs

Typeevidence

Reduceverbosity

Typeclasses

DependencyInjectionatCompiletime

Extendinglibraries

Page 10: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Butbeware

Resolutionrulescanbedifficult

Automaticconversions

Donotoveruse

Page 11: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

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 = ...

Page 12: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 13: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 14: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 15: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 16: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 17: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 18: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 19: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 20: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 21: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 22: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 23: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 24: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 25: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 26: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 27: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 28: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 29: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 30: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 31: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 32: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 33: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 34: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 35: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 36: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 37: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 38: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 39: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 40: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 41: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 42: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 43: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 44: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 45: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 46: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 47: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 48: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 49: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 50: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 51: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 52: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 53: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 54: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 55: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 56: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 57: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 58: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 59: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 60: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 61: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 62: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 63: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 64: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 65: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 66: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 67: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 68: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 69: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Scoping

OderskyExplains

Lookupprecedence:

1. Bynameonly,withoutanyprefix

2. In"implicitscope":

companion/packageobjectof

thesourcetype

itsparameters+supertypeandsupertraits

Page 70: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Demo

Scopingandresolving

Page 71: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 72: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 73: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 74: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 75: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 76: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 77: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 78: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 79: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 80: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 81: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 82: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 83: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 84: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

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 ...}

Page 85: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Demo

TypeclassforJSONSerialisation

Naivewithsubtyping

Typeclass+improvements

Page 86: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 87: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 88: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 89: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 90: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 91: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 92: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 93: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 94: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 95: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 96: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 97: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 98: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 99: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 100: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 101: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 102: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 103: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 104: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 105: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 106: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 107: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 108: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 109: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 110: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 111: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 112: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 113: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 114: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 115: Implicits Inspected and Explained @ ScalaDays 2016 Berlin
Page 116: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Recap

Implicitsarepowerful

Becarefulwithconversions

Implicitprecedence:firstlooklocal,thenincompanion/packageobject

Typeclassestoextendlibraries

Page 117: Implicits Inspected and Explained @ ScalaDays 2016 Berlin

Recap

Implicitsarepowerful

Becarefulwithconversions

Implicitprecedence:firstlooklocal,thenincompanion/packageobject

Typeclassestoextendlibraries

Questions?