为什么我不能使用 case 类的构造函数作为函数在 map() 中使用

oly*_*lyk 2 lambda scala parser-combinators case-class fastparse

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

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 _)
                        ^
Run Code Online (Sandbox Code Playgroud)

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

Yuv*_*kov 6

您正在寻找 .tupled

List((1, 2)).map(A.tupled)
Run Code Online (Sandbox Code Playgroud)

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

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

final case class A(tup: (Int, Int))
Run Code Online (Sandbox Code Playgroud)

然后这有效:

List((1, 2)).map(A)
Run Code Online (Sandbox Code Playgroud)