2

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

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 库中有类似的东西吗?

4

2 回答 2

6

您正在寻找.tupled

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

这不能“开箱即用”的原因是因为A需要两个 type 参数Int,而不是(Int, Int). tupled升入. (A, A)_((A, A))

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

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

然后这个工作:

List((1, 2)).map(A)
于 2020-07-22T04:37:01.130 回答
4

原因如下:

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

翻译为:

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

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

于 2020-07-22T04:37:14.120 回答