It supports conversion to an ordinary Scala List
of elements of the least upper bound of the original types,
It is covariant,
It is covariant,
object CovariantHelper { trait Fruit case class Apple() extends Fruit case class Pear() extends Fruit type FFFF = Fruit :: Fruit :: Fruit :: Fruit :: HNil type APAP = Apple :: Pear :: Apple :: Pear :: HNil val a : Apple = Apple() val p : Pear = Pear() val apap : APAP = a :: p :: a :: p :: HNil }
It also has a flatMap Operation
It has a set of fully polymorphic fold operations which take a polymorphic binary function value.
It has a set of fully polymorphic fold operations which take a polymorphic binary function value. The fold is sensitive
to the static types of all of the elements of the HList
. Given the earlier definition of size,
object addSize extends Poly2 { implicit def default[T](implicit st: shapelessex.size.Case.Aux[T, Int]) = at[Int, T]{ (acc, t) => acc+size(t) } }
It has a map
operation, applying a polymorphic function value across its elements.
It has a map
operation, applying a polymorphic function value across its elements. This means that it subsumes both
typical HList
's and also KList
's (HList
's whose elements share a common outer type constructor).
And it has a Typeable
type class instance (see below), allowing, eg.
And it has a Typeable
type class instance (see below), allowing, eg. vanilla List[Any]
's or HList
's with
elements of type Any
to be safely cast to precisely typed HList
's.
These last three features make this HList
dramatically more practically useful than HList
's are typically thought to be:
normally the full type information required to work with them is too fragile to cross subtyping or I/O boundaries.
This implementation supports the discarding of precise information where necessary.
(eg. to serialize a precisely typed record after construction), and its later reconstruction.
(eg. a weakly typed deserialized record with a known schema can have it's precise typing reestabilished).
And it has a unify operation which converts it to an HList of elements of the least upper bound of the original types,
It also has a zipper for traversal and persistent update,
The parameterless execute method has been deprecated and will be removed in a future version of ScalaTest. Please invoke execute with empty parens instead: execute().
The trap method is no longer needed for demos in the REPL, which now abreviates stack traces, and will be removed in a future version of ScalaTest
Heterogenous lists
shapeless provides a comprehensive Scala
HList
which has many features not shared by other HList implementations.