View
205
Download
1
Category
Preview:
Citation preview
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
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
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 ...}
Recap
Implicitsarepowerful
Becarefulwithconversions
Implicitprecedence:firstlooklocal,thenincompanion/packageobject
Typeclassestoextendlibraries
Recap
Implicitsarepowerful
Becarefulwithconversions
Implicitprecedence:firstlooklocal,thenincompanion/packageobject
Typeclassestoextendlibraries
Questions?
TimSoethout@ScalaDays2016Berlin
References
/
Scaladocumentation:
Book:
Blog
,specialthanksto@Ichoranand@som-snytt
,forthedemoslides
http://blog.timmybankers.nl
Slides Code
JavaConverters
FindingImplicits
ScalaInDepth
EffectiveScala
AllThingsRunnable
ScalaGitterchannel
REPLesent
Recommended