給定兩個case class
ES:具有相同形狀的案例類?
case class Foo(x: Int)
case class Bar(x: Int)
使用shapeless
,我怎麼能確定是否Foo
和Bar
具有相同的 「形」,即Int :: HNil
是HList
?
給定兩個case class
ES:具有相同形狀的案例類?
case class Foo(x: Int)
case class Bar(x: Int)
使用shapeless
,我怎麼能確定是否Foo
和Bar
具有相同的 「形」,即Int :: HNil
是HList
?
對於具體的case類,你可以這樣做:
case class Foo(x: Int)
case class Bar(x: Int)
case class Baz(x: String)
implicitly[Generic.Aux[Foo, Int :: HNil]]
implicitly[Generic.Aux[Bar, Int :: HNil]]
implicitly[Generic.Aux[Baz, String :: HNil]]
更通用的方法:
如果你喜歡用值,您可以創建功能工作:
def test[A, B, L <: HList](a: A, b: B)(implicit
gen1: Generic.Aux[A, L],
gen2: Generic.Aux[B, L]): Int = 42
val foo = Foo(1)
val bar = Bar(2)
val baz = Baz("a")
test(foo, bar) // compiles
// test(foo, baz) // doesn't compile
如果你喜歡使用您可以創建的類型類型:
trait SameShape[A, B]
object SameShape {
implicit def mkSameShape[A, B, L <: HList](implicit
gen1: Generic.Aux[A, L],
gen2: Generic.Aux[B, L]
): SameShape[A, B] =
new SameShape[A, B] {}
}
implicitly[SameShape[Foo, Bar]] // compiles
// implicitly[SameShape[Foo, Baz]] // doesn't compile
A
, B
如果存在形狀S
具有相同的形狀,使得S
是A
和B
的通用表示。這直接轉化爲以下功能:
trait SameShape[A, B]
object SameShape {
implicit def instance[A, B, S]
(implicit a: Generic.Aux[A, S], b: Generic.Aux[B, S]): SameShape[A, B] =
new SameShape[A, B] {}
}
我猜在這種情況下返回類型甚至沒有關係。 – Haspemulator
很確定你的意思是'def'而不是'val'。 –
另外,'Generic'只有一個類型參數。您可能需要'Generic.Aux' –
'=:='不工作? –