gpt4 book ai didi

scala - 如何在编译时检查类型是否为元组

转载 作者:行者123 更新时间:2023-12-01 11:21:51 25 4
gpt4 key购买 nike

我有以下案例类:

case class MyClass[A,B](a:A, b:B)

我想向 MyClass 添加一个像 unzip 这样的函数,所以如果 AB 是 Tuple 类型,那么我想像下面这样提取它们以下:

val item = MyClass[(Int,String), (Int,String)]((2,"two"), (3,"three"))
val item_left = MyClass(item.a._1, item.b._1)
val item_right = MyClass(item.a._2, item.b._2)

我应该怎么做并在编译时检查元组的类型?我不想在伴随对象中定义它,我希望它成为 MyClass 中的一个函数。我知道我可以定义一个 implicit 函数,但这是唯一的方法吗?

最佳答案

您可以使用 <:<输入类来证明 ABTuple2 的子类型,以便您可以分解它们。也就是说,我们可以写一个 unzip具有一些自由类型参数的方法,这些参数将是分解的纵坐标类型(称它们为 A1A2B1B2 )。然后,我们需要证据表明 A <:< (A1, A2)B <:< (B1, B2) .如果子类型关系为真,编译器将找到这些类型类的实例,我们可以使用它们来完成转换。即 A <:< (A1, A2)扩展函数 A => (A1, A2) .

case class MyClass[A, B](a: A, b: B) {
def unzip[A1, A2, B1, B2](implicit
ev1: A <:< (A1, A2),
ev2: B <:< (B1, B2)
): (MyClass[A1, A2], MyClass[B1, B2]) = {
val (a1, a2) = ev1(a)
val (b1, b2) = ev2(b)
(MyClass(a1, a2), MyClass(b1, b2))
}
}

在行动中:

scala> MyClass((2, "two"), (3, "three")).unzip
res6: (MyClass[Int,String], MyClass[Int,String]) = (MyClass(2,two),MyClass(3,three))

对于非元组:

scala> MyClass(1, 2).unzip
<console>:14: error: Cannot prove that Int <:< (A1, A2).
MyClass(1, 2).unzip
^

关于scala - 如何在编译时检查类型是否为元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41402503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com