为什么我不能将 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]
。您将必须定义一个构造函数,该构造函数采用两个整数的元组。
编译器不接受将元组直接传递给构造函数,如最小示例所示:
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]
。您将必须定义一个构造函数,该构造函数采用两个整数的元组。