Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Typelevel's path to Scala 3

A1216674d5c9747bcdcc716872439137?s=47 Lars Hupel
February 13, 2021

Typelevel's path to Scala 3

Scala 3 is just around the corner. Both EPFL and the broader community have put a lot of work into making this Scala release a success. In this talk, I will outline some of the history behind Scala 3 and what steps we took in the Typelevel ecosystem to get ready for Scala 3, and keep up with its development.

A1216674d5c9747bcdcc716872439137?s=128

Lars Hupel

February 13, 2021
Tweet

Transcript

  1. T y p e l e v e l ’s

    p a t h t o S c a l a 3 L a r s H u p e l S c a l a L o v e i n t h e C i t y 2 0 2 1 - 0 2 - 1 3
  2. T y p e l e v e l

  3. None
  4. None
  5. T y p e l e v e l F

    o u n d e d i n 2 0 1 3 a t N o r t h e a s t S c a l a S y m p o s i u m
  6. T y p e l e v e l F

    o u n d e d i n 2 0 1 3 a t N o r t h e a s t S c a l a S y m p o s i u m T o d a y : 7 0 + p r o j e c t s , v i b r a n t e c o s y s t e m
  7. T y p e l e v e l p

    r o j e c t s C e n t r a l t h e m e : S c a l a - i d i o m a t i c F u n c t i o n a l P r o g r a m m i n g
  8. T y p e l e v e l p

    r o j e c t s C e n t r a l t h e m e : S c a l a - i d i o m a t i c F u n c t i o n a l P r o g r a m m i n g • . . . w i t h a s l i t t l e h a s s l e a s p o s s i b l e
  9. T y p e l e v e l p

    r o j e c t s C e n t r a l t h e m e : S c a l a - i d i o m a t i c F u n c t i o n a l P r o g r a m m i n g • . . . w i t h a s l i t t l e h a s s l e a s p o s s i b l e • . . . w i t h a s l i t t l e r u n t i m e o v e r h e a d a s p o s s i b l e
  10. T y p e l e v e l p

    r o j e c t s C e n t r a l t h e m e : S c a l a - i d i o m a t i c F u n c t i o n a l P r o g r a m m i n g • . . . w i t h a s l i t t l e h a s s l e a s p o s s i b l e • . . . w i t h a s l i t t l e r u n t i m e o v e r h e a d a s p o s s i b l e • . . . a s s a f e a s p o s s i b l e
  11. T y p e c l a s s e

    s
  12. T y p e c l a s s e

    s S u p r e m e l y u s e f u l t o o l , p i o n e e r e d i n H a s k e l l
  13. T y p e c l a s s e

    s S u p r e m e l y u s e f u l t o o l , p i o n e e r e d i n H a s k e l l class Semigroup a => Monoid a where mempty :: a mconcat :: [a] -> a mconcat = foldr mappend mempty
  14. T y p e c l a s s e

    s S u p r e m e l y u s e f u l t o o l , p i o n e e r e d i n H a s k e l l class Semigroup a => Monoid a where mempty :: a mconcat :: [a] -> a mconcat = foldr mappend mempty I t J u s t W o r k s ™ !
  15. None
  16. None
  17. T y p e c l a s s e

    s i n S c a l a . . . n o w w e j u s t n e e d t o e n c o d e t h e m i n S c a l a
  18. T y p e c l a s s e

    s i n S c a l a . . . n o w w e j u s t n e e d t o e n c o d e t h e m i n S c a l a • m u l t i p l e i n h e r i t a n c e ?
  19. T y p e c l a s s e

    s i n S c a l a . . . n o w w e j u s t n e e d t o e n c o d e t h e m i n S c a l a • m u l t i p l e i n h e r i t a n c e ? • s y n t a x ? ?
  20. T y p e c l a s s e

    s i n S c a l a . . . n o w w e j u s t n e e d t o e n c o d e t h e m i n S c a l a • m u l t i p l e i n h e r i t a n c e ? • s y n t a x ? ? • g l o b a l c o n f l u e n c e ? ? ?
  21. T y p e c l a s s e

    s i n S c a l a . . . n o w w e j u s t n e e d t o e n c o d e t h e m i n S c a l a • m u l t i p l e i n h e r i t a n c e ? • s y n t a x ? ? • g l o b a l c o n f l u e n c e ? ? ?
  22. None
  23. T h e r i s e o f t

    h e m a c r o s
  24. T y p e c l a s s e

    s , e n c o d e d I n 2 0 1 5 , M i c h a e l P i l q u i s t s t a r t e d s i m u l a c r u m . G o a l : c o n s i s t e n t e n c o d i n g a c r o s s d i f f e r e n t p r o j e c t s , 0 b o i l e r p l a t e
  25. S i m u l a c r u m

    I n p u t import simulacrum._ @typeclass trait Semigroup[A] { @op("|+|") def append(x: A, y: A): A }
  26. S i m u l a c r u m

    O u t p u t object Semigroup { def apply[A](implicit instance: Semigroup[A]): Semigroup[A] = instance // ... }
  27. S i m u l a c r u m

    M o r e o u t p u t object Semigroup { trait Ops[A] { def typeClassInstance: Semigroup[A] def self: A def |+|(y: A): A = typeClassInstance.append(self, y) } }
  28. S i m u l a c r u m

    E v e n m o r e o u t p u t object Semigroup { trait ToSemigroupOps { implicit def toSemigroupOps[A](target: A)(implicit tc: Semigroup[A]): Ops[A] val self = target val typeClassInstance = tc } } object nonInheritedOps extends ToSemigroupOps }
  29. S i m u l a c r u m

    Y e t m o r e o u t p u t object Semigroup { trait AllOps[A] extends Ops[A] { def typeClassInstance: Semigroup[A] } object ops { implicit def toAllSemigroupOps[A](target: A)(implicit tc: Semigroup[A]): AllO val self = target val typeClassInstance = tc } } }
  30. None
  31. B u t i t w o r k s

    ! S i m u l a c r u m s o l v e d a t o n o f i s s u e s W e c a n w r i t e x |+| y!
  32. B u t i t w o r k s

    ! S i m u l a c r u m s o l v e d a t o n o f i s s u e s W e c a n w r i t e x |+| y! U s e d b y C a t s a n d t o n s o f t h i r d - p a r t y l i b r a r i e s
  33. W e ’ r e n o t d o

    n e y e t S i m u l a c r u m d i d n ’ t s o l v e t h e p e r f o r m a n c e i s s u e .
  34. W e ’ r e n o t d o

    n e y e t S i m u l a c r u m d i d n ’ t s o l v e t h e p e r f o r m a n c e i s s u e . I n p u t x |+| y
  35. W e ’ r e n o t d o

    n e y e t S i m u l a c r u m d i d n ’ t s o l v e t h e p e r f o r m a n c e i s s u e . O u t p u t Semigroup.ops.toAllSemigroupOps(x).|+|(y)
  36. E n t e r M a c h i

    n i s t S p l i t o u t o f S p i r e b y E r i k O s h e i m i n 2 0 1 4
  37. E n t e r M a c h i

    n i s t S p l i t o u t o f S p i r e b y E r i k O s h e i m i n 2 0 1 4 N o w ( 2 0 2 0 ) a r c h i v e d a n d r e - i n c o r p o r a t e d i n t o S p i r e
  38. None
  39. T y p e c o n s t r

    u c t o r s
  40. T y p e c o n s t r

    u c t o r p o l y m o r p h i s m case class EitherT[F[_], A, B](value: F[Either[A, B]]) { // ... }
  41. T y p e c o n s t r

    u c t o r p o l y m o r p h i s m case class EitherT[F[_], A, B](value: F[Either[A, B]]) { // ... } S c a l a i s t h e o n l y l a n g u a g e t h a t c a n d o t h a t ! *
  42. T y p e c o n s t r

    u c t o r p o l y m o r p h i s m L a n d e d i n S c a l a 2 . 5 b y A d r i a a n M o o r s ( 2 0 0 7 )
  43. T y p e c o n s t r

    u c t o r p o l y m o r p h i s m L a n d e d i n S c a l a 2 . 5 b y A d r i a a n M o o r s ( 2 0 0 7 ) C o m p l e t e g a m e - c h a n g e r
  44. “ A s s o o n a s y

    o u g i v e S c a l a p r o g r a m m e r s a n e w t o y , t h e y w i l l s t a r t a b u s i n g i t i n w a y s y o u c a n ’ t i m a g i n e . ” – a n c i e n t S c a l a p r o v e r b
  45. S c a l a i s n ’ t

    H a s k e l l H a s k e l l instance Monad (Either a) where {- ... -}
  46. S c a l a i s n ’ t

    H a s k e l l H a s k e l l instance Monad (Either a) where {- ... -} S c a l a implicit val eitherMonad[A]: Monad[({ type λ[β] = Either[A, β] })#λ] = // ...
  47. None
  48. k i n d - p r o j e

    c t o r
  49. k i n d - p r o j e

    c t o r E v e n m a c r o s c a n ’ t f i x m i s s i n g s y n t a x . * W e n e e d a c o m p i l e r p l u g i n !
  50. k i n d - p r o j e

    c t o r E v e n m a c r o s c a n ’ t f i x m i s s i n g s y n t a x . * W e n e e d a c o m p i l e r p l u g i n ! implicit val eitherMonad[A]: Monad[Either[A, ?]] = // ...
  51. None
  52. S I - 2 7 1 2 def foo[F[_], A](fa:

    F[A]) = // ... // doesn't compile! // Either[_, _] is not an F[_] foo(x: Either[String, Int])
  53. U n a p p l y D e p

    e n d e n t m e t h o d t y p e s + t o n s o f b o i l e r p l a t e = S I - 2 7 1 2 h a c k
  54. U n a p p l y trait Unapply[TC[_[_]], MA]

    { type M[_] type A def TC: TC[M] def subst: MA => M[A] } // okay ...
  55. U n a p p l y implicit def unapply3MTLeft[TC[_[_]],

    F[_[_],_,_], AA[_], B, C] (implicit tc: TC[F[AA,?,C]]): Aux3MTLeft[TC,F[AA, B, C], F, AA, B, C] = new Unapply[TC, F[AA,B,C]] { type M[X] = F[AA, X, C] type A = B def TC: TC[F[AA, ?, C]] = tc def subst: F[AA, B, C] => M[A] = identity } // the what now?!?!
  56. None
  57. S e v e n y e a r s

    l a t e r . . . M i l e s f i x e s i t f o r S c a l a 2 .1 2 !
  58. S e v e n y e a r s

    l a t e r . . . M i l e s f i x e s i t f o r S c a l a 2 .1 2 ! ( . . . a n d f o r 2 .1 0 a n d 2 .1 1 w i t h a c o m p i l e r p l u g i n )
  59. S e v e n y e a r s

    l a t e r . . . M i l e s f i x e s i t f o r S c a l a 2 .1 2 ! ( . . . a n d f o r 2 .1 0 a n d 2 .1 1 w i t h a c o m p i l e r p l u g i n )
  60. T y p e c o n s t r

    u c t o r s i n D o t t y T h e D o t t y t e a m h a s t a k e n g r e a t c a r e t o c o n s o l i d a t e t h e c u r r e n t “ h a c k s ” T y p e l a m b d a s n o w b u i l t i n !
  61. None
  62. None
  63. None
  64. M a c r o s

  65. S c a l a 2 m a c r

    o s L a n d e d i n S c a l a 2 .1 0 ( 2 0 1 2 ) E n a b l e d l o t s o f i n n o v a t i o n a c r o s s t h e b o a r d
  66. S c a l a 2 m a c r

    o s L a n d e d i n S c a l a 2 .1 0 ( 2 0 1 2 ) E n a b l e d l o t s o f i n n o v a t i o n a c r o s s t h e b o a r d S a d l y , n o t a v a i l a b l e a n y m o r e i n D o t t y
  67. None
  68. M i g r a t i o n o

    f s c o d e c F i r s t s u p p o r t e d v e r s i o n : D o t t y 0 . 2 2 . 0 *
  69. M i g r a t i o n o

    f s c o d e c F i r s t s u p p o r t e d v e r s i o n : D o t t y 0 . 2 2 . 0 * R e q u i r e s c o m p l e t e r e i m p l e m e n t a t i o n b e t w e e n S c a l a 2 a n d D o t t y
  70. W h a t ’s n e x t ?

  71. S c a l a 3 . 0 . 0

    i s n e a r ! l a n g u a g e f e a t u r e s s i m u l a c r u m m a n y m a j o r T y p e l e v e l p r o j e c t s r e l e a s e t r a i n
  72. S c a l a 3 . 0 . 0

    i s n e a r ! l a n g u a g e f e a t u r e s s i m u l a c r u m m a n y m a j o r T y p e l e v e l p r o j e c t s r e l e a s e t r a i n S t i l l l o t s t o d o ( M o n i x , h t t p 4 s , . . . )
  73. Q & A L a r s H u p

    e l � l a r s . h u p e l @ i n n o q . c o m � @ l a r s r _ h w w w . i n n o q . c o m
  74. L A R S H U P E L S

    e n i o r C o n s u l t a n t i n n o Q D e u t s c h l a n d G m b H L a r s i s k n o w n a s o n e o f t h e f o u n d e r s o f t h e T y p e - l e v e l i n i t i a t i v e w h i c h i s d e d i c a t e d t o p r o v i d i n g p r i n c i p l e d , t y p e - d r i v e n S c a l a l i b r a r i e s i n a f r i e n d l y , w e l c o m i n g e n v i r o n m e n t . A f r e q u e n t c o n f e r e n c e s p e a k e r , t h e y a r e a c t i v e i n t h e o p e n s o u r c e c o m - m u n i t y , p a r t i c u l a r l y i n S c a l a .
  75. S o u r c e s • https://twitter.com/ohbadiah/status/299937487713878016 •

    https://twitter.com/travisbrown/status/300015411125174273 • https://secure.trifork.com/dl/techmesh-london-2012/slides/JohnHughes_and_PhilipWadler_and_ SimonPeytonJones_KeynoteHaskellPracticalAsWellAsCool.pdf • https://www.reddit.com/r/shiba/comments/e6ec1e/angry_shiba/ • https://pixabay.com/vectors/people-jump-silhouette-group-male-4894818/