SlideShare ist ein Scribd-Unternehmen logo
1 von 67
What to Leave Implicit
Martin Odersky
Scala Days Chicago
April 2017
Con-textual
what comes with the text,
but is not in the text
Context is all around us
- the current configuration
- the current scope
- the meaning of “<” on this type
- the user on behalf of which the
operation is performed
- the security level in effect
…
- globals
rigid if immutable,
unsafe if mutable
- monkey patching
- dependency injection
at runtime (Spring, Guice)
or with macros (MacWire)
- cake pattern
close coupling + recursion
Traditional ways to express context
“Parameterize all the things”
The Functional Way
- no side effects
- type-safe
- fine-grained control
Functional is Good
- sea of parameters
- most of which hardly ever change
- repetitive, boring, prone to mistakes
But sometimes it’s too much of a
good thing …
If passing a lot of parameters gets tedious,
leave some of them implicit.
A more direct approach
• If there’s one feature that makes Scala “Scala”,
I would pick implicits.
• There’s hardly an API without them.
• They enable advanced and elegant
architectural designs.
• They are also misused way too often.
Implicits
• takes you through the most common uses of
implicits,
• gives recommendations of use patterns,
• goes through a set of proposed language
changes that will make implicits even more
powerful and safer to use.
This Talk
t
• If you do not give an argument to an implicit
parameter, one will be provided for you.
• Eligible are all implicit values that are visible at
the point of call.
• If there are more than one eligible candidate,
the most specific one is chosen.
• If there’s no unique most specific candidate, an
ambiguity error Is reported.
Ground Rules
• They are a cousin of implicit parameters.
• If the type A of an expression does not match
the expected type B …
Implicit Conversions
• They are a cousin of implicit parameters.
• If the type A of an expression does not match
the expected type B …
… the compiler tries to find an implicit
conversion method from A to B.
• Same rules as for implicit parameters apply.
Implicit Conversions
• Shorthand for defining a new class and an
implicit conversion into it.
implicit class C(x: T) { … }
expands to
class C(x: T) { … }
implicit def C(x: T) = new C(x)
Implicit Classes
• Implicits leverage what the compiler knows
about your code.
• They remove repetition and boilerplate.
• But taken too far, they can hurt readability.
When To Use Implicits?
Applicability:
Where are you allowed to elide implied information?
How do you find out this is happening?
Power:
What influence does the elided info have?
Can it change radically behavior or types?
Scope:
How much of the rest of the code do you need to know
to find out what is implied?
Is there always a clear place to look?
* Adapted from Rust’s Language Ergonomics Initiative
Reasoning Footprint of Implicitness*
Patterns of Implicit Conversions
Extension Methods
Discoverability: medium
Power: low
Scope: large, but IDEs help
Extension Methods
Discoverability: medium
Power: low
Scope: large, but IDEs help
Late Trait Implementation
Make existing classes implement new traits
without changing their code.
This was the original reason for implicits in Scala.
Discoverability: low to medium
Power: low to medium
Scope: large, but IDEs help
They also have some use cases, e.g.
• cached implicit classes
• context-dependent views
What about simple conversions?
• Conversions that go both ways
• Conversions that change semantics
E.g. collection.convert.WrapAs{Java,Scala}
Better: Use Converters
collection.convert.DecorateAs{Java,Scala}
Anti Patterns
Conversions that undermine type safety
Anti Patterns
Conversions between pre-existing types
Discoverability: low
Power: high
Scope: very large
Anti Patterns
Discoverability: high
Power: low to high
Scope: large, but can be explored in IntelliJ
Implicit Parameters
Implicit parameters can
• prove theorems
• establish context
• set configurations
• inject dependencies
• model capabilities
• implement type classes
Implicit Parameters - Use Cases
Curry Howard isomorphism:
Types = Theorems
Programs = Proofs
C.f. Kennedy & Russo: “Generalized Type Constraints”, OOPSLA 2004
Prove Theorems
Establish Context
Example: conference management system.
Reviewers should only see (directly or indirectly) the
scores of papers where they have no conflict with an
author.
Establish Context
Example: conference management system.
Context is usually stable, can change at specific points.
Configuration &
Dependency Management
are special cases of context passing.
see also: Dick Wall: The parfait pattern
Implement Type Classes
Example: Ordering
How can we make implicits better?
What will change:
1. Tighten the rules for implicit conversions
2. Lazy implicits
3. Multiple implicit parameter lists
4. Coherence(?)
5. Implicit function types
1. Tighten Rules for
Implicit Conversions
Question: What does this print?
Answer: java.lang.IndexOutOfBoundsException: 42
Hint: List[String] <: Function[Int, String]
In the future: Only implicit methods are eligible as
conversions.
A new class ImplicitConverter allows to abstract over
implicit conversions.
Converters are turned into conversions like this:
1. Tighten Rules for
Implicit Conversions
Implementation Status
2. Lazy Implicits
Problem: When synthesizing code for recursive data
structures, we get divergent implicit searches.
E.g.
will diverge if A expands recursively to Sum[A, B]
2. Lazy Implicits
Solution: Delay the implicit search and tie the recursive
knot with a lazy val if a parameter is call-by-name:
This change, proposed by Miles Sabin, is a more robust
solution than the current “Lazy” type in shapeless.
Implementation Status
3. Multiple Implicit Parameter Lists
Problem: Implicit parameters are currently a bit irregular
compared to normal parameters:
• there can be only one implicit parameter section
• and it must come last.
This leads to some awkward workarounds (c.f. Aux
pattern).
Related problem: It’s sometimes confusing when a
parameter is implicit or explicit.
3. Multiple Implicit Parameter Lists
Proposal:
• Allow multiple implicit parameter lists
• Implicit and explicit parameter lists can be mixed freely.
• Explicit application of an implicit parameter must be
marked with a new “magic” method, explicitly.
• Implementation status: Proposal. Main challenge is
migration from current Scala.
4. Coherence
Difference between Scala’s implicits and Haskell’s type
classes: The latter are required to be coherent:
A type can implement a type class in one way only
(globally).
This is very restrictive, rules out most of the implicit use
cases we have seen.
But it also provides some benefits.
Coherence Rules Out Ambiguities
Say you have a capability system dealing with driver
licences:
If you can drive a truck and a cab, you should be able to
drive a car. But Scala would give you an ambiguity error.
Coherence Rules Out Ambiguities
Proposal:
• Allow type classes to declare themselves coherent.
• Have the compiler check that coherent traits have only
one implementation per type.
This is quite tricky. See github.com/lampepfl/dotty/issues/2047
• Drop all ambiguity checks for coherent implicits.
Parametricity
• It turns out that a necessary condition to ensure
coherence is to disallow operations like equals,
hashCode, isInstanceOf on coherent types.
• This restriction is useful in other contexts as well
because it gives us “theorems for free”.
• Proposal: Change Scala’s
top types to:
• AnyObj has all of current
Any’s methods. Any has only
the escape-hatch method
asInstanceOf.
Implementation Status
5. Implicit Function Types
Have another look at the conference management system:
In a large system, it gets tedious to declare all these
implicit Viewers parameters.
Can we do better?
Having to write
a couple of times does not look so bad.
But in the dotty compiler there are > 2600 occurrences of
the parameter
Would it not be nice to get rid of them?
Towards a solution
Let’s massage the definition of viewRankings a bit:
Towards a solution
Let’s massage the definition of viewRankings a bit:
Towards a solution
Let’s massage the definition of viewRankings a bit:
What is its type?
So far: Viewers => List[Paper]
From now on: implicit Viewers=> List[Paper]
or, desugared: ImplicitFunction1[Viewers, List[Paper]]
Inside ImplicitFunction1
ImplicitFunction1 can be thought of being defined as
follows:
Analogously for all other arities.
Two Rules for Typing
1. Implicit functions get implicit arguments just like implicit
methods. Given:
val f: implicit A => B
implicit val a: A
f expands to f(a).
2. Implicit functions get created on demand. If the
expected type of b is implicit A => B, then
b expands to implicit (_: A) => b
Revised Example
Assume:
Then reformulate:
Efficiency
Implicit function result types can be optimized
Instead of creating a closure like this:
we can simply create a curried function like this:
This brings the cost of implicit functions down to simple
implicit parameters.
Implementation Status
• The reader monad is a somewhat popular method to
pass context.
• Essentially, it wraps the implicit reading in a monad.
• One advantage: The reading is abstracted in a type.
• But I believe this is shooting sparrows with cannons.
• Monads are about sequencing, they have have nothing
to do with passing context.
The Reader Monad
• allow the same conciseness as the reader
monad,
• don’t force you into monadic style with explicit
sequencing,
• are fully composable,
• are more than 7x faster than the reader monad.
Implicit function types
Neat way to define structure-building DSLs, like this:
Natively supported in Groovy and in Kotlin via
“receiver functions”.
An encore: The Builder Pattern
Scala Implementation
• Any situation where an entity is implicitly
understood can be expressed with implicit
function types.
• We have seen:
“The current set of viewers”
“The structure to which current code should be added”
• Other possibilities:
“The current configuration”
“The currently running transaction”
“The capabilities needed to run this code”
"The effects this code has on the outside world”
…
Conjecture
Find out more on scala-lang.org/blog
• Implicit function types are a neat way to
abstract over contexts.
• It’s a very powerful feature, because it allows
one to inject implicit values in a scope simply
by defining a type.
• I expect it will fundamentally affect the kind of
code we will write in the future.
Summary (1)
• Implicit parameters are a fundamental and
powerful language construct.
• They are “just” parameterization, but remove
the boilerplate.
• One construct  multifaceted use cases
• Abstractable using implicit function types.
• Implicit conversions are also very convenient,
but should be used with care.
Summary (2)
When Can I Expect This?
Scala 2.12
Scala 2.13
Scala 3.0
TASTY,
middle end?
stdlib
collections
dotty MVP
dotty 0.x releases
2016
backend, classpath handling
Scala 2.14
2017
2018
This is open source work, depends on community’s contributions.
 Roadmap is tentative, no promises:
“MVP” = minimal
viable
prototype
Dotty:
Dmitry Petrashko Nicolas Stucki
Guillaume Martres Sebastien Douraene
Felix Mulder Ondrej Lhotak
Liu Fengyun Enno Runne
Close collaboration with scalac team @ Lightbend:
Adriaan Moors Seth Tisue
Jason Zaugg Stefan Zeiger
Lukas Rytz
Credits
Thank You

Weitere ähnliche Inhalte

Was ist angesagt?

[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PGPgDay.Seoul
 
Understanding the architecture of MariaDB ColumnStore
Understanding the architecture of MariaDB ColumnStoreUnderstanding the architecture of MariaDB ColumnStore
Understanding the architecture of MariaDB ColumnStoreMariaDB plc
 
Large Scale Graph Analytics with JanusGraph
Large Scale Graph Analytics with JanusGraphLarge Scale Graph Analytics with JanusGraph
Large Scale Graph Analytics with JanusGraphP. Taylor Goetz
 
High Availability Storage (susecon2016)
High Availability Storage (susecon2016)High Availability Storage (susecon2016)
High Availability Storage (susecon2016)Roger Zhou 周志强
 
Distributed Locking in Kubernetes
Distributed Locking in KubernetesDistributed Locking in Kubernetes
Distributed Locking in KubernetesRafał Leszko
 
Let's talk about Garbage Collection
Let's talk about Garbage CollectionLet's talk about Garbage Collection
Let's talk about Garbage CollectionHaim Yadid
 
HBaseCon 2013: Apache HBase and HDFS - Understanding Filesystem Usage in HBase
HBaseCon 2013: Apache HBase and HDFS - Understanding Filesystem Usage in HBaseHBaseCon 2013: Apache HBase and HDFS - Understanding Filesystem Usage in HBase
HBaseCon 2013: Apache HBase and HDFS - Understanding Filesystem Usage in HBaseCloudera, Inc.
 
Spectrum Scale Best Practices by Olaf Weiser
Spectrum Scale Best Practices by Olaf WeiserSpectrum Scale Best Practices by Olaf Weiser
Spectrum Scale Best Practices by Olaf WeiserSandeep Patil
 
Demystifying MySQL Replication Crash Safety
Demystifying MySQL Replication Crash SafetyDemystifying MySQL Replication Crash Safety
Demystifying MySQL Replication Crash SafetyJean-François Gagné
 
Best Practices with PostgreSQL on Solaris
Best Practices with PostgreSQL on SolarisBest Practices with PostgreSQL on Solaris
Best Practices with PostgreSQL on SolarisJignesh Shah
 
Nori: The Official Elasticsearch Plugin for Korean Language Analysis
Nori: The Official Elasticsearch Plugin for Korean Language AnalysisNori: The Official Elasticsearch Plugin for Korean Language Analysis
Nori: The Official Elasticsearch Plugin for Korean Language AnalysisElasticsearch
 
MariaDB 제품 소개
MariaDB 제품 소개MariaDB 제품 소개
MariaDB 제품 소개NeoClova
 
[OpenStack Days Korea 2016] Track1 - All flash CEPH 구성 및 최적화
[OpenStack Days Korea 2016] Track1 - All flash CEPH 구성 및 최적화[OpenStack Days Korea 2016] Track1 - All flash CEPH 구성 및 최적화
[OpenStack Days Korea 2016] Track1 - All flash CEPH 구성 및 최적화OpenStack Korea Community
 
From distributed caches to in-memory data grids
From distributed caches to in-memory data gridsFrom distributed caches to in-memory data grids
From distributed caches to in-memory data gridsMax Alexejev
 
Node mailer example how to send email using nodemailer with gmail &amp; mailtrap
Node mailer example how to send email using nodemailer with gmail &amp; mailtrapNode mailer example how to send email using nodemailer with gmail &amp; mailtrap
Node mailer example how to send email using nodemailer with gmail &amp; mailtrapKaty Slemon
 
JVM Memory Management Details
JVM Memory Management DetailsJVM Memory Management Details
JVM Memory Management DetailsAzul Systems Inc.
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기찬희 이
 
CH09:Collection與Map
CH09:Collection與MapCH09:Collection與Map
CH09:Collection與MapJustin Lin
 

Was ist angesagt? (20)

[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG[Pgday.Seoul 2018]  이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
[Pgday.Seoul 2018] 이기종 DB에서 PostgreSQL로의 Migration을 위한 DB2PG
 
Understanding the architecture of MariaDB ColumnStore
Understanding the architecture of MariaDB ColumnStoreUnderstanding the architecture of MariaDB ColumnStore
Understanding the architecture of MariaDB ColumnStore
 
Large Scale Graph Analytics with JanusGraph
Large Scale Graph Analytics with JanusGraphLarge Scale Graph Analytics with JanusGraph
Large Scale Graph Analytics with JanusGraph
 
High Availability Storage (susecon2016)
High Availability Storage (susecon2016)High Availability Storage (susecon2016)
High Availability Storage (susecon2016)
 
Distributed Locking in Kubernetes
Distributed Locking in KubernetesDistributed Locking in Kubernetes
Distributed Locking in Kubernetes
 
Let's talk about Garbage Collection
Let's talk about Garbage CollectionLet's talk about Garbage Collection
Let's talk about Garbage Collection
 
HBaseCon 2013: Apache HBase and HDFS - Understanding Filesystem Usage in HBase
HBaseCon 2013: Apache HBase and HDFS - Understanding Filesystem Usage in HBaseHBaseCon 2013: Apache HBase and HDFS - Understanding Filesystem Usage in HBase
HBaseCon 2013: Apache HBase and HDFS - Understanding Filesystem Usage in HBase
 
Codership's galera cluster installation and quickstart webinar march 2016
Codership's galera cluster installation and quickstart webinar march 2016Codership's galera cluster installation and quickstart webinar march 2016
Codership's galera cluster installation and quickstart webinar march 2016
 
Spectrum Scale Best Practices by Olaf Weiser
Spectrum Scale Best Practices by Olaf WeiserSpectrum Scale Best Practices by Olaf Weiser
Spectrum Scale Best Practices by Olaf Weiser
 
Demystifying MySQL Replication Crash Safety
Demystifying MySQL Replication Crash SafetyDemystifying MySQL Replication Crash Safety
Demystifying MySQL Replication Crash Safety
 
Best Practices with PostgreSQL on Solaris
Best Practices with PostgreSQL on SolarisBest Practices with PostgreSQL on Solaris
Best Practices with PostgreSQL on Solaris
 
Galera Cluster Best Practices for DBA's and DevOps Part 1
Galera Cluster Best Practices for DBA's and DevOps Part 1Galera Cluster Best Practices for DBA's and DevOps Part 1
Galera Cluster Best Practices for DBA's and DevOps Part 1
 
Nori: The Official Elasticsearch Plugin for Korean Language Analysis
Nori: The Official Elasticsearch Plugin for Korean Language AnalysisNori: The Official Elasticsearch Plugin for Korean Language Analysis
Nori: The Official Elasticsearch Plugin for Korean Language Analysis
 
MariaDB 제품 소개
MariaDB 제품 소개MariaDB 제품 소개
MariaDB 제품 소개
 
[OpenStack Days Korea 2016] Track1 - All flash CEPH 구성 및 최적화
[OpenStack Days Korea 2016] Track1 - All flash CEPH 구성 및 최적화[OpenStack Days Korea 2016] Track1 - All flash CEPH 구성 및 최적화
[OpenStack Days Korea 2016] Track1 - All flash CEPH 구성 및 최적화
 
From distributed caches to in-memory data grids
From distributed caches to in-memory data gridsFrom distributed caches to in-memory data grids
From distributed caches to in-memory data grids
 
Node mailer example how to send email using nodemailer with gmail &amp; mailtrap
Node mailer example how to send email using nodemailer with gmail &amp; mailtrapNode mailer example how to send email using nodemailer with gmail &amp; mailtrap
Node mailer example how to send email using nodemailer with gmail &amp; mailtrap
 
JVM Memory Management Details
JVM Memory Management DetailsJVM Memory Management Details
JVM Memory Management Details
 
PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기PySpark 배우기 Ch 06. ML 패키지 소개하기
PySpark 배우기 Ch 06. ML 패키지 소개하기
 
CH09:Collection與Map
CH09:Collection與MapCH09:Collection與Map
CH09:Collection與Map
 

Ähnlich wie What To Leave Implicit

What To Leave Implicit
What To Leave ImplicitWhat To Leave Implicit
What To Leave ImplicitMartin Odersky
 
Principled And Clean Coding
Principled And Clean CodingPrincipled And Clean Coding
Principled And Clean CodingMetin Ogurlu
 
Working With Concurrency In Java 8
Working With Concurrency In Java 8Working With Concurrency In Java 8
Working With Concurrency In Java 8Heartin Jacob
 
Java Closures
Java ClosuresJava Closures
Java ClosuresBen Evans
 
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...Raffi Khatchadourian
 
EuroAD 2021: ChainRules.jl
EuroAD 2021: ChainRules.jl EuroAD 2021: ChainRules.jl
EuroAD 2021: ChainRules.jl Lyndon White
 
GoF Design patterns I: Introduction + Structural Patterns
GoF Design patterns I:   Introduction + Structural PatternsGoF Design patterns I:   Introduction + Structural Patterns
GoF Design patterns I: Introduction + Structural PatternsSameh Deabes
 
FRONTEND BOOTCAMP Session 2.pptx
FRONTEND BOOTCAMP Session 2.pptxFRONTEND BOOTCAMP Session 2.pptx
FRONTEND BOOTCAMP Session 2.pptxEhtesham46
 
Java+8-New+Features.pdf
Java+8-New+Features.pdfJava+8-New+Features.pdf
Java+8-New+Features.pdfgurukanth4
 
Few minutes To better Code - Refactoring
Few minutes To better Code - RefactoringFew minutes To better Code - Refactoring
Few minutes To better Code - RefactoringDiaa Al-Salehi
 
Introduction to Software - Coder Forge - John Mulhall
Introduction to Software - Coder Forge - John MulhallIntroduction to Software - Coder Forge - John Mulhall
Introduction to Software - Coder Forge - John MulhallJohn Mulhall
 
Improving Software Quality Using Object Oriented Design Principles
Improving Software Quality Using Object Oriented Design PrinciplesImproving Software Quality Using Object Oriented Design Principles
Improving Software Quality Using Object Oriented Design PrinciplesDr. Syed Hassan Amin
 
Framework Design Guidelines
Framework Design GuidelinesFramework Design Guidelines
Framework Design GuidelinesMohamed Meligy
 

Ähnlich wie What To Leave Implicit (20)

What To Leave Implicit
What To Leave ImplicitWhat To Leave Implicit
What To Leave Implicit
 
Simplicitly
SimplicitlySimplicitly
Simplicitly
 
Principled And Clean Coding
Principled And Clean CodingPrincipled And Clean Coding
Principled And Clean Coding
 
Working With Concurrency In Java 8
Working With Concurrency In Java 8Working With Concurrency In Java 8
Working With Concurrency In Java 8
 
Java Closures
Java ClosuresJava Closures
Java Closures
 
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
Open Problems in Automatically Refactoring Legacy Java Software to use New Fe...
 
Design p atterns
Design p atternsDesign p atterns
Design p atterns
 
EuroAD 2021: ChainRules.jl
EuroAD 2021: ChainRules.jl EuroAD 2021: ChainRules.jl
EuroAD 2021: ChainRules.jl
 
GoF Design patterns I: Introduction + Structural Patterns
GoF Design patterns I:   Introduction + Structural PatternsGoF Design patterns I:   Introduction + Structural Patterns
GoF Design patterns I: Introduction + Structural Patterns
 
FRONTEND BOOTCAMP Session 2.pptx
FRONTEND BOOTCAMP Session 2.pptxFRONTEND BOOTCAMP Session 2.pptx
FRONTEND BOOTCAMP Session 2.pptx
 
Java+8-New+Features.pdf
Java+8-New+Features.pdfJava+8-New+Features.pdf
Java+8-New+Features.pdf
 
Few minutes To better Code - Refactoring
Few minutes To better Code - RefactoringFew minutes To better Code - Refactoring
Few minutes To better Code - Refactoring
 
Introduction to Software - Coder Forge - John Mulhall
Introduction to Software - Coder Forge - John MulhallIntroduction to Software - Coder Forge - John Mulhall
Introduction to Software - Coder Forge - John Mulhall
 
Functional Programming in Java
Functional Programming in JavaFunctional Programming in Java
Functional Programming in Java
 
Intro to Scala
 Intro to Scala Intro to Scala
Intro to Scala
 
Improving Software Quality Using Object Oriented Design Principles
Improving Software Quality Using Object Oriented Design PrinciplesImproving Software Quality Using Object Oriented Design Principles
Improving Software Quality Using Object Oriented Design Principles
 
14274730 (1).ppt
14274730 (1).ppt14274730 (1).ppt
14274730 (1).ppt
 
Code Metrics
Code MetricsCode Metrics
Code Metrics
 
Core_Java_Interview.pdf
Core_Java_Interview.pdfCore_Java_Interview.pdf
Core_Java_Interview.pdf
 
Framework Design Guidelines
Framework Design GuidelinesFramework Design Guidelines
Framework Design Guidelines
 

Mehr von Martin Odersky

Capabilities for Resources and Effects
Capabilities for Resources and EffectsCapabilities for Resources and Effects
Capabilities for Resources and EffectsMartin Odersky
 
Implementing Higher-Kinded Types in Dotty
Implementing Higher-Kinded Types in DottyImplementing Higher-Kinded Types in Dotty
Implementing Higher-Kinded Types in DottyMartin Odersky
 
Compilers Are Databases
Compilers Are DatabasesCompilers Are Databases
Compilers Are DatabasesMartin Odersky
 
Scala Days San Francisco
Scala Days San FranciscoScala Days San Francisco
Scala Days San FranciscoMartin Odersky
 
The Evolution of Scala
The Evolution of ScalaThe Evolution of Scala
The Evolution of ScalaMartin Odersky
 
Scala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationScala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationMartin Odersky
 
flatMap Oslo presentation slides
flatMap Oslo presentation slidesflatMap Oslo presentation slides
flatMap Oslo presentation slidesMartin Odersky
 
Oscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simpleOscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simpleMartin Odersky
 
Scala eXchange opening
Scala eXchange openingScala eXchange opening
Scala eXchange openingMartin Odersky
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Martin Odersky
 

Mehr von Martin Odersky (17)

scalar.pdf
scalar.pdfscalar.pdf
scalar.pdf
 
Capabilities for Resources and Effects
Capabilities for Resources and EffectsCapabilities for Resources and Effects
Capabilities for Resources and Effects
 
Preparing for Scala 3
Preparing for Scala 3Preparing for Scala 3
Preparing for Scala 3
 
From DOT to Dotty
From DOT to DottyFrom DOT to Dotty
From DOT to Dotty
 
Implementing Higher-Kinded Types in Dotty
Implementing Higher-Kinded Types in DottyImplementing Higher-Kinded Types in Dotty
Implementing Higher-Kinded Types in Dotty
 
Scala Days NYC 2016
Scala Days NYC 2016Scala Days NYC 2016
Scala Days NYC 2016
 
Compilers Are Databases
Compilers Are DatabasesCompilers Are Databases
Compilers Are Databases
 
Scala Days San Francisco
Scala Days San FranciscoScala Days San Francisco
Scala Days San Francisco
 
Scalax
ScalaxScalax
Scalax
 
The Evolution of Scala
The Evolution of ScalaThe Evolution of Scala
The Evolution of Scala
 
Scala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentationScala - The Simple Parts, SFScala presentation
Scala - The Simple Parts, SFScala presentation
 
Flatmap
FlatmapFlatmap
Flatmap
 
flatMap Oslo presentation slides
flatMap Oslo presentation slidesflatMap Oslo presentation slides
flatMap Oslo presentation slides
 
Devoxx
DevoxxDevoxx
Devoxx
 
Oscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simpleOscon keynote: Working hard to keep it simple
Oscon keynote: Working hard to keep it simple
 
Scala eXchange opening
Scala eXchange openingScala eXchange opening
Scala eXchange opening
 
Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009Scala Talk at FOSDEM 2009
Scala Talk at FOSDEM 2009
 

Kürzlich hochgeladen

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoffsammart93
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...DianaGray10
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...apidays
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businesspanagenda
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Angeliki Cooney
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...Zilliz
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsNanddeep Nachan
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...apidays
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Jeffrey Haguewood
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Bhuvaneswari Subramani
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyKhushali Kathiriya
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusZilliz
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Victor Rentea
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 

Kürzlich hochgeladen (20)

Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 

What To Leave Implicit

  • 1. What to Leave Implicit Martin Odersky Scala Days Chicago April 2017
  • 2. Con-textual what comes with the text, but is not in the text
  • 3. Context is all around us - the current configuration - the current scope - the meaning of “<” on this type - the user on behalf of which the operation is performed - the security level in effect …
  • 4. - globals rigid if immutable, unsafe if mutable - monkey patching - dependency injection at runtime (Spring, Guice) or with macros (MacWire) - cake pattern close coupling + recursion Traditional ways to express context
  • 5. “Parameterize all the things” The Functional Way
  • 6. - no side effects - type-safe - fine-grained control Functional is Good
  • 7. - sea of parameters - most of which hardly ever change - repetitive, boring, prone to mistakes But sometimes it’s too much of a good thing …
  • 8. If passing a lot of parameters gets tedious, leave some of them implicit. A more direct approach
  • 9. • If there’s one feature that makes Scala “Scala”, I would pick implicits. • There’s hardly an API without them. • They enable advanced and elegant architectural designs. • They are also misused way too often. Implicits
  • 10. • takes you through the most common uses of implicits, • gives recommendations of use patterns, • goes through a set of proposed language changes that will make implicits even more powerful and safer to use. This Talk t
  • 11. • If you do not give an argument to an implicit parameter, one will be provided for you. • Eligible are all implicit values that are visible at the point of call. • If there are more than one eligible candidate, the most specific one is chosen. • If there’s no unique most specific candidate, an ambiguity error Is reported. Ground Rules
  • 12. • They are a cousin of implicit parameters. • If the type A of an expression does not match the expected type B … Implicit Conversions
  • 13. • They are a cousin of implicit parameters. • If the type A of an expression does not match the expected type B … … the compiler tries to find an implicit conversion method from A to B. • Same rules as for implicit parameters apply. Implicit Conversions
  • 14. • Shorthand for defining a new class and an implicit conversion into it. implicit class C(x: T) { … } expands to class C(x: T) { … } implicit def C(x: T) = new C(x) Implicit Classes
  • 15. • Implicits leverage what the compiler knows about your code. • They remove repetition and boilerplate. • But taken too far, they can hurt readability. When To Use Implicits?
  • 16. Applicability: Where are you allowed to elide implied information? How do you find out this is happening? Power: What influence does the elided info have? Can it change radically behavior or types? Scope: How much of the rest of the code do you need to know to find out what is implied? Is there always a clear place to look? * Adapted from Rust’s Language Ergonomics Initiative Reasoning Footprint of Implicitness*
  • 17. Patterns of Implicit Conversions
  • 18. Extension Methods Discoverability: medium Power: low Scope: large, but IDEs help
  • 19. Extension Methods Discoverability: medium Power: low Scope: large, but IDEs help
  • 20. Late Trait Implementation Make existing classes implement new traits without changing their code. This was the original reason for implicits in Scala. Discoverability: low to medium Power: low to medium Scope: large, but IDEs help
  • 21. They also have some use cases, e.g. • cached implicit classes • context-dependent views What about simple conversions?
  • 22. • Conversions that go both ways • Conversions that change semantics E.g. collection.convert.WrapAs{Java,Scala} Better: Use Converters collection.convert.DecorateAs{Java,Scala} Anti Patterns
  • 23. Conversions that undermine type safety Anti Patterns
  • 24. Conversions between pre-existing types Discoverability: low Power: high Scope: very large Anti Patterns
  • 25. Discoverability: high Power: low to high Scope: large, but can be explored in IntelliJ Implicit Parameters
  • 26. Implicit parameters can • prove theorems • establish context • set configurations • inject dependencies • model capabilities • implement type classes Implicit Parameters - Use Cases
  • 27. Curry Howard isomorphism: Types = Theorems Programs = Proofs C.f. Kennedy & Russo: “Generalized Type Constraints”, OOPSLA 2004 Prove Theorems
  • 28. Establish Context Example: conference management system. Reviewers should only see (directly or indirectly) the scores of papers where they have no conflict with an author.
  • 29. Establish Context Example: conference management system. Context is usually stable, can change at specific points.
  • 30. Configuration & Dependency Management are special cases of context passing. see also: Dick Wall: The parfait pattern
  • 32. How can we make implicits better?
  • 33. What will change: 1. Tighten the rules for implicit conversions 2. Lazy implicits 3. Multiple implicit parameter lists 4. Coherence(?) 5. Implicit function types
  • 34. 1. Tighten Rules for Implicit Conversions Question: What does this print? Answer: java.lang.IndexOutOfBoundsException: 42 Hint: List[String] <: Function[Int, String]
  • 35. In the future: Only implicit methods are eligible as conversions. A new class ImplicitConverter allows to abstract over implicit conversions. Converters are turned into conversions like this: 1. Tighten Rules for Implicit Conversions
  • 37. 2. Lazy Implicits Problem: When synthesizing code for recursive data structures, we get divergent implicit searches. E.g. will diverge if A expands recursively to Sum[A, B]
  • 38. 2. Lazy Implicits Solution: Delay the implicit search and tie the recursive knot with a lazy val if a parameter is call-by-name: This change, proposed by Miles Sabin, is a more robust solution than the current “Lazy” type in shapeless.
  • 40. 3. Multiple Implicit Parameter Lists Problem: Implicit parameters are currently a bit irregular compared to normal parameters: • there can be only one implicit parameter section • and it must come last. This leads to some awkward workarounds (c.f. Aux pattern). Related problem: It’s sometimes confusing when a parameter is implicit or explicit.
  • 41. 3. Multiple Implicit Parameter Lists Proposal: • Allow multiple implicit parameter lists • Implicit and explicit parameter lists can be mixed freely. • Explicit application of an implicit parameter must be marked with a new “magic” method, explicitly. • Implementation status: Proposal. Main challenge is migration from current Scala.
  • 42. 4. Coherence Difference between Scala’s implicits and Haskell’s type classes: The latter are required to be coherent: A type can implement a type class in one way only (globally). This is very restrictive, rules out most of the implicit use cases we have seen. But it also provides some benefits.
  • 43. Coherence Rules Out Ambiguities Say you have a capability system dealing with driver licences: If you can drive a truck and a cab, you should be able to drive a car. But Scala would give you an ambiguity error.
  • 44. Coherence Rules Out Ambiguities Proposal: • Allow type classes to declare themselves coherent. • Have the compiler check that coherent traits have only one implementation per type. This is quite tricky. See github.com/lampepfl/dotty/issues/2047 • Drop all ambiguity checks for coherent implicits.
  • 45. Parametricity • It turns out that a necessary condition to ensure coherence is to disallow operations like equals, hashCode, isInstanceOf on coherent types. • This restriction is useful in other contexts as well because it gives us “theorems for free”. • Proposal: Change Scala’s top types to: • AnyObj has all of current Any’s methods. Any has only the escape-hatch method asInstanceOf.
  • 47. 5. Implicit Function Types Have another look at the conference management system: In a large system, it gets tedious to declare all these implicit Viewers parameters.
  • 48. Can we do better? Having to write a couple of times does not look so bad. But in the dotty compiler there are > 2600 occurrences of the parameter Would it not be nice to get rid of them?
  • 49. Towards a solution Let’s massage the definition of viewRankings a bit:
  • 50. Towards a solution Let’s massage the definition of viewRankings a bit:
  • 51. Towards a solution Let’s massage the definition of viewRankings a bit: What is its type? So far: Viewers => List[Paper] From now on: implicit Viewers=> List[Paper] or, desugared: ImplicitFunction1[Viewers, List[Paper]]
  • 52. Inside ImplicitFunction1 ImplicitFunction1 can be thought of being defined as follows: Analogously for all other arities.
  • 53. Two Rules for Typing 1. Implicit functions get implicit arguments just like implicit methods. Given: val f: implicit A => B implicit val a: A f expands to f(a). 2. Implicit functions get created on demand. If the expected type of b is implicit A => B, then b expands to implicit (_: A) => b
  • 55. Efficiency Implicit function result types can be optimized Instead of creating a closure like this: we can simply create a curried function like this: This brings the cost of implicit functions down to simple implicit parameters.
  • 57. • The reader monad is a somewhat popular method to pass context. • Essentially, it wraps the implicit reading in a monad. • One advantage: The reading is abstracted in a type. • But I believe this is shooting sparrows with cannons. • Monads are about sequencing, they have have nothing to do with passing context. The Reader Monad
  • 58. • allow the same conciseness as the reader monad, • don’t force you into monadic style with explicit sequencing, • are fully composable, • are more than 7x faster than the reader monad. Implicit function types
  • 59. Neat way to define structure-building DSLs, like this: Natively supported in Groovy and in Kotlin via “receiver functions”. An encore: The Builder Pattern
  • 61. • Any situation where an entity is implicitly understood can be expressed with implicit function types. • We have seen: “The current set of viewers” “The structure to which current code should be added” • Other possibilities: “The current configuration” “The currently running transaction” “The capabilities needed to run this code” "The effects this code has on the outside world” … Conjecture
  • 62. Find out more on scala-lang.org/blog
  • 63. • Implicit function types are a neat way to abstract over contexts. • It’s a very powerful feature, because it allows one to inject implicit values in a scope simply by defining a type. • I expect it will fundamentally affect the kind of code we will write in the future. Summary (1)
  • 64. • Implicit parameters are a fundamental and powerful language construct. • They are “just” parameterization, but remove the boilerplate. • One construct  multifaceted use cases • Abstractable using implicit function types. • Implicit conversions are also very convenient, but should be used with care. Summary (2)
  • 65. When Can I Expect This? Scala 2.12 Scala 2.13 Scala 3.0 TASTY, middle end? stdlib collections dotty MVP dotty 0.x releases 2016 backend, classpath handling Scala 2.14 2017 2018 This is open source work, depends on community’s contributions.  Roadmap is tentative, no promises: “MVP” = minimal viable prototype
  • 66. Dotty: Dmitry Petrashko Nicolas Stucki Guillaume Martres Sebastien Douraene Felix Mulder Ondrej Lhotak Liu Fengyun Enno Runne Close collaboration with scalac team @ Lightbend: Adriaan Moors Seth Tisue Jason Zaugg Stefan Zeiger Lukas Rytz Credits

Hinweis der Redaktion

  1. OPEN GAMBIT Multicore. Cloud computing. Containers. You’ll likely agree that the infrastructure for amazing scalability is in place, it’s been well funded. It’s the underpinning that’s required for enterprises to movie en masse to the cloud. But what are they moving? Applications. Applications that run their business, engage their customers, allow them to innovate and enter new markets. Without applications, this infinitely scalable infrastructure is nothing.
  2. OPEN GAMBIT Multicore. Cloud computing. Containers. You’ll likely agree that the infrastructure for amazing scalability is in place, it’s been well funded. It’s the underpinning that’s required for enterprises to movie en masse to the cloud. But what are they moving? Applications. Applications that run their business, engage their customers, allow them to innovate and enter new markets. Without applications, this infinitely scalable infrastructure is nothing.