scala shapeless lenses not working -
in project encountered situation need perform nested update on immutable object instance of case class.
firstly wanted use copy
function provided case classes stumbled upon lenses. looked shapeless
, scalaz
implementations , decided try use lenses shapeless
, grabbed dependency, added "com.chuusai" % "shapeless" % "2.0.0" cross crossversion.full
build.sbt
, tried write simple, based on available example on github
: https://github.com/milessabin/shapeless/wiki/feature-overview:-shapeless-2.0.0#boilerplate-free-lenses-for-arbitrary-case-classes.
object lenseexamples extends app { import shapeless._ // pair of ordinary case classes ... case class address(street : string, city : string, postcode : string) case class person(name : string, age : int, address : address) // lenses on person/address ... val namelens = lens[person] >> 0 val agelens = lens[person] >> 1 val addresslens = lens[person] >> 2 val streetlens = lens[person] >> 2 >> 0 val citylens = lens[person] >> 2 >> 1 val postcodelens = lens[person] >> 2 >> 2 val person = person("joe grey", 37, address("southover street", "brighton", "bn2 9ua")) val age1 = agelens.get(person) }
but during compilation getting errors like:
inferred type arguments [nothing,int] not conform method >>'s type parameter bounds [l <: shapeless.hlist,n <: shapeless.nat] val namelens = lens[person] >> 0 ^ type mismatch; found : int(0) required: n val namelens = lens[person] >> 0 ^ not find implicit value parameter iso: shapeless.iso[api.lenseexamples.person,l] val namelens = lens[person] >> 0 ^ ^
probably missing obvious because copy-pasted example wiki.
edit: after comment travis generated dependency graph project using https://github.com/jrudolph/sbt-dependency-graph , observed spray-routing
including shapeless
library:
[info] +-io.spray:spray-routing:1.3.0 [s] [info] | +-com.chuusai:shapeless_2.10:1.2.4 [s] [info] | | +-org.scala-lang:scala-library:2.10.0 (evicted by: 2.10.4) [info] | | +-org.scala-lang:scala-library:2.10.3 (evicted by: 2.10.4)
so removed dependency , tried example https://github.com/milessabin/shapeless/blob/scala-2.9.x/examples/src/main/scala/shapeless/examples/lenses.scala , works properly.
your example should work if replace lens[person]
lens[person]
(ie. lower case l
) throughout. why? shapeless dependency pointing @ just-published, not yet announced or documented shapeless-2.0.0 final release. shh ... don't tell ;-)
Comments
Post a Comment