感谢https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0,我现在知道如何将shapeless HLists压缩起来了:
从Shapeless 2.0.0-M1导入一些内容:
创建两个HList:
现在尝试定义一个完成相同任务的函数:
推断的返回类型是Unit,确实将f应用于h1和h2就是这样做的:
从Shapeless 2.0.0-M1导入一些内容:
import shapeless._
import shapeless.ops.hlist._
import syntax.std.tuple._
import Zipper._
创建两个HList:
scala> val h1 = 5 :: "a" :: HNil
h1: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] = 5 :: a :: HNil
scala> val h2 = 6 :: "b" :: HNil
h2: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] = 6 :: b :: HNil
压缩它们:
scala> (h1, h2).zip
res52: ((Int, Int), (String, String)) = ((5,6),(a,b))
现在尝试定义一个完成相同任务的函数:
scala> def f[HL <: HList](h1: HL, h2: HL) = (h1, h2).zip
f: [HL <: shapeless.HList](h1: HL, h2: HL)Unit
推断的返回类型是Unit,确实将f应用于h1和h2就是这样做的:
scala> f(h1, h2)
scala>
是否有一种方法来定义f使得在这种情况下我得到((5,6),(a,b))?
我的最终目的是定义一个函数,将这两个HList捆绑在一起,并对它们进行映射,根据抛硬币结果选择_1或_2,从而产生另一个HL。
object mix extends Poly1 {
implicit def caseTuple[T] = at[(T, T)](t =>
if (util.Random.nextBoolean) t._2 else t._1)
}
在 REPL 中可以正常工作:
scala> (h1, h2).zip.map(mix)
res2: (Int, String) = (5,b)
但是当我尝试将其放入函数中时,上述问题令我困扰。
谢谢!
Unit
问题已经在第一个里程碑之后被修复了。现在那些例子将无法编译,并且错误信息应该会告诉你需要添加到方法定义中的Zip
实例。 - Travis Brown