shapeless: generic programming for Scala
shapeless is a type class and dependent type based generic programming library for Scala. It had its origins in several talks by Miles Sabin (@milessabin), given over the course of 2011, on implementing scrap your boilerplate and higher rank polymorphism in Scala. Since then it has evolved from being a resolutely experimental project into library which, while still testing the limits of what's possible in Scala, is being used widely in production systems wherever there are arities to be abstracted over and boilerplate to be scrapped.
Projects which use shapeless
There is a wide variety of projects which use shapeless in one way or another ... see the incomplete list of projects for ideas and inspiration. If you are using shapeless and your project isn't listed yet, please add it.
Finding out more about the project
The feature overview for shapeless-2.0.0 provides a very incomplete introduction to shapeless. Additional information can be found in subsequent release notes. If you are upgrading from shapeless-2.0.0 you will find the migration guide useful. We're not satisfied with the current state of the documentation and would love help in improving it.
shapeless is part of the Typelevel family of projects. It is an Open Source project under the Apache License v2, hosted on github. Binary artefacts are published to the Sonatype OSS Repository Hosting service and synced to Maven Central.
Most discussion of shapeless and generic programming in Scala happens on the shapeless Gitter channel. There is also a mailing list and IRC channel, but these are largely dormant now that most activity has moved to Gitter. Questions about shapeless are often asked and answered under the shapeless tag on StackOverflow. Some articles on the implementation techniques can be found on Miles's blog, and Olivera, Moors and Odersky, Type Classes as Object and Implicits is useful background material.
Whilst shapeless is a somewhat "advanced" Scala library, it is a lot more approachable than many people think. Contributors are usually available to field questions, give advice and discuss ideas on the Gitter channel, and for people wanting to take their first steps at contributing we have a selection of open issues flagged up as being good candidates to take on. No contribution is too small, and guidance is always available.
Binary release artefacts are published to the Sonatype OSS Repository Hosting service and synced to Maven Central. Snapshots of the master branch are built using Travis CI and automatically published to the Sonatype OSS Snapshot repository. To include the Sonatype repositories in your SBT build you should add,
resolvers ++= Seq( Resolver.sonatypeRepo("releases"), Resolver.sonatypeRepo("snapshots") )
Please be aware that SBT 0.13.6 has an issue related to its new name hashing feature which when compiling with shapeless might cause SBT to loop indefinitely consuming all heap. Workarounds are to move to an earlier (0.13.5) or later (0.13.7, 0.13.8) SBT version or disable name hashing by adding,
incOptions := incOptions.value.withNameHashing(false)
to your settings.
Builds are available for Scala 2.11.x and for Scala 2.10.x. The main line of development for shapeless 2.2.5 is Scala 2.11.7 with Scala 2.10.x supported via the macro paradise compiler plugin.
scalaVersion := "2.11.7" libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % "2.2.5" )
shapeless is also available for projects using the Maven build tool via the following dependency,
<dependency> <groupId>com.chuusai</groupId> <artifactId>shapeless_2.11</artifactId> <version>2.2.5</version> </dependency>
If you are using Scala 2.10.x, note that unlike earlier versions, it is no longer necessary to provide an explicit Scala version suffix for your shapeless dependency. You must however ensure that you are using Scala version 2.10.2 or greater, with Scala 2.10.6 (or switching to 2.11.x) strongly recommended. You should also add the macro paradise plugin to your build,
scalaVersion := "2.10.6" libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % "2.2.5", compilerPlugin("org.scalamacros" % "paradise" % "2.0.1" cross CrossVersion.full) )
For Maven builds the dependency is,
<dependency> <groupId>com.chuusai</groupId> <artifactId>shapeless_2.10</artifactId> <version>2.2.5</version> </dependency>
With macro paradise added as a compiler plugin to the build configuration,
<plugins> ... <plugin> ... <configuration> ... <compilerPlugins> <compilerPlugin> <groupId>org.scala-lang.plugins</groupId> <artifactId>macro-paradise_2.10</artifactId> <version>2.1.0</version> </compilerPlugin> </compilerPlugins> ... </configuration> ... </plugin> ... </plugins>
The shapeless-2.2.1 release accidentally broke binary compatability with shapeless-2.2.0 and has been deprecated. Please use shapeless-2.2.5 instead.
Please use a current release if possible. If unavoidable, you can find usage information for older releases on the shapeless wiki.
shapeless is built with SBT 0.13.9 or later, and its master branch is built with Scala 2.11.7 by default but also cross-builds for 2.10.6 and 2.12.x.
- Alessandro Lacava email@example.com @lambdista
- Alexander Konovalov firstname.lastname@example.org @alexknvl
- Alexandre Archambault email@example.com @alxarchambault
- Alistair Johnson firstname.lastname@example.org
- Alois Cochard email@example.com @aloiscochard
- Andreas Koestler firstname.lastname@example.org @AndreasKostler
- Andrew Brett email@example.com @Ephemerix
- Ben Hutchison firstname.lastname@example.org @ben_hutchison
- Ben James email@example.com @bmjames
- Brian McKenna firstname.lastname@example.org @puffnfresh
- Bryn Keller email@example.com @brynkeller
- Chris Hodapp firstname.lastname@example.org @clhodapp
- Cody Allen email@example.com @fourierstrick
- Dale Wijnand firstname.lastname@example.org @dwijnand
- Dario Rexin email@example.com @evonox
- David Barri firstname.lastname@example.org @japgolly
- Denis Mikhaylov email@example.com @notxcain
- Eugene Burmako firstname.lastname@example.org @xeno_by
- Filipe Nepomuceno email@example.com
- Frank S. Thomas firstname.lastname@example.org @fst9000
- George Leontiev email@example.com @folone
- Howard Branch firstname.lastname@example.org @purestgreen
- Huw Giddens email@example.com
- Jason Zaugg firstname.lastname@example.org @retronym
- Jean-Remi Desjardins email@example.com @jrdesjardins
- Johannes Rudolph firstname.lastname@example.org @virtualvoid
- Johnny Everson email@example.com @johnny_everson
- Joni Freeman firstname.lastname@example.org @jonifreeman
- Julien Tournay email@example.com @skaalf
- Jules Gosnell firstname.lastname@example.org
- Kevin Wright email@example.com @thecoda
- Lars Hupel firstname.lastname@example.org @larsr_h
- Mario Pastorelli email@example.com @mapastr
- Mathias Doenitz firstname.lastname@example.org @sirthias
- Michael Donaghy email@example.com
- Michael Pilquist firstname.lastname@example.org @mpilquist
- Miles Sabin email@example.com @milessabin
- Nikolas Evangelopoulos firstname.lastname@example.org
- Oleg Aleshko email@example.com @OlegYch
- Owein Reese firstname.lastname@example.org @OweinReese
- Paolo G. Giarrusso email@example.com @blaisorblade
- Pascal Voitot firstname.lastname@example.org @mandubian
- Peter Schmitz email@example.com @peterschmitz_
- Renato Cavalcanti firstname.lastname@example.org @renatocaval
- Ryo Hongo email@example.com @ryoppy516
- Sam Halliday firstname.lastname@example.org @fommil
- Sarah Gerweck email@example.com @SGerweck
- Sébastien Doeraene firstname.lastname@example.org @sjrdoeraene
- Simon Hafner email@example.com @reactormonk
- Stacy Curl firstname.lastname@example.org @stacycurl
- Stephen Compall email@example.com @S11001001
- Tin Pavlinic firstname.lastname@example.org @triggerNZ
- Tom Switzer email@example.com @tixxit
- Travis Brown firstname.lastname@example.org @travisbrown
- Vladimir Matveev email@example.com @netvlm