KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I have done a few implementations of HList now. One based on Daniel Spiewak's High Wizardry in the Land of Scala talk and another based on a post in Apocalisp blog. The goal was to have a heterogenous list of which is not heterogenous in the primary type but rather the higher kind. For example: val requests = Request[String] :: Request[Int] :: HNil I would be able to do a map across the list to perform the request and result in a heterogenous list of the higher kind. So: requests.map(execute) should equal String :: Int :: HNil Sadly all my attempts have resulted in an HList of Any. Here is the code from a recent attempt: class Request[+Out](o:Out) { type O = Out def v:O = o } object HList { trait Func[-Elem,Out] { type Apply[E <: Elem] <: Out def apply[N <: Elem](e:N):Apply[N] } sealed trait HList[Base] { type Head <: Base type Tail <: HList[Base] type Map[Out,F <: Func[Base,Out]] <: HList[Out] def head:Head def tail:Tail def ::[A <: Base](a:A):HList[Base] def map[Out,F <: Func[Base,Out]](f:F):Map[Out,F] } case class HNil[Base]() extends HList[Base] { type Head = Nothing type Tail = Nothing type Map[Out,F <: Func[Base,Out]] = HNil[Out] def head = error("Head of an empty HList") def tail = error("Head of an empty HList") def ::[A <: Base](a:A) = HCons(a,this) def map[Out,F <: Func[Base,Out]](f:F) = new HNil[Out] } case class HCons[Base,A <: Base,B <: HList[Base]](head: A, tail: B) extends HList[Base] { type Head = A type Tail = B type Map[Out,F <: Func[Base,Out]] = HCons[Out,F#Apply[Head],Tail#Map[Out,F]] def ::[C <: Base](c:C) = HCons(c,this) def map[Out,F <: Func[Base,Out]](f:F) = HCons(f(head),tail.map(f)) } val :: = HCons } object Test extends Application { impor
Tags (comma-separated)
Save Edits
Cancel