为什么我不能将 case class 的构造函数用作在 map() 内部使用的函数

Why can't I use the constructor of a case class as a function for use inside map()

编译器不接受将元组直接传递给构造函数,如最小示例所示:

scala> case class A(a:Int, b:Int)
defined class A

scala> List((1, 2)).map(A)
<console>:14: error: type mismatch;
found   : A.type
required: ((Int, Int)) => ?
    List((1, 2)).map(A)
                        ^

scala> List((1, 2)).map(A _)
<console>:14: error: _ must follow method; cannot follow A.type
    List((1, 2)).map(A _)
                        ^

Scala 解析器组合器具有运算符 ^^。 fastparse库中有类似的东西吗?

您正在寻找 .tupled

List((1, 2)).map(A.tupled)

这不能“开箱即用”的原因是因为 A 需要两个 Int 类型的参数,而不是 (Int, Int) 的元组。 tupled(A, A) 提升为 ((A, A))

您可以通过修改 A 的构造函数来验证这一点:

final case class A(tup: (Int, Int))

然后这有效:

List((1, 2)).map(A)

这是因为:

List((1, 2)).map(A)

转换为:

List((1, 2)).map(x => A(x))

但是 A 构造函数使用两个整数作为参数而不是 Tuple2[Int, Int]。您将必须定义一个构造函数,该构造函数采用两个整数的元组。