压缩 HList 的函数的推断类型

2024-05-08

谢谢https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0 https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0我了解如何压缩无形的 HList:

从 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)

但是当我尝试将其放入函数中时,我遇到了上述问题。

Thanks!


您可以使用一种方法将所有内容包装起来Zip(或者在这种情况下Zip.Aux) 类型类:

import shapeless._, shapeless.ops.hlist._

object mix extends Poly1 {
  implicit def caseTuple[T] = at[(T, T)](t =>
    if (util.Random.nextBoolean) t._2 else t._1)
}

def zipAndMix[L <: HList, Z <: HList](h1: L, h2: L)(implicit
  zipper: Zip.Aux[L :: L :: HNil, Z],
  mapper: Mapper[mix.type, Z]
) = (h1 zip h2) map mix

现在假设你有h1 and h2如问题中定义,您可以这样写:

scala> zipAndMix(h1, h2)
res0: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] = 5 :: b :: HNil

scala> zipAndMix(h1, h2)
res1: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] = 6 :: a :: HNil

scala> zipAndMix(h1, h2)
res2: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] = 5 :: a :: HNil

等等。这将在 2.0.0-M1 或最新快照中工作,尽管(正如我在上面的评论中指出的)您可能会在之前遇到令人困惑的问题这个错误已修复 https://github.com/milessabin/shapeless/pull/56.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

压缩 HList 的函数的推断类型 的相关文章

随机推荐