具有地图功能的Scala lambda函数

时间:2018-07-07 21:23:29

标签: scala dictionary lambda functional-programming

我定义以下变量x

val x = Array((3,2), (4,5))

其类型为Array[(Int, Int)]

当我执行以下操作时:

x.map((a: Int, b: Int) => "(" + a + ", " + b + ")")

我收到以下错误:

console:28: error: type mismatch;
found   : (Int, Int) => String
required: ((Int, Int)) => ?
             x.map((a: Int, b: Int) => "(" + a + ", " + b + ")")

为什么期望第一个元素的类型为((Int, Int))

4 个答案:

答案 0 :(得分:4)

(Int, Int) => ...是具有两个参数的函数的类型,两个参数都为Int(这就是(a: Int, b: Int) => ...将始终给出的)。

((Int, Int)) => ...是具有一个(Int, Int)参数的函数的类型。 map上的Array需要一个带有一个参数的函数,对于Array[(Int, Int)],此参数的类型必须为(Int, Int)

所以您需要写

x.map(pair => "(" + pair._1 + ", " + pair._2 + ")")

其中pair的类型为(Int, Int),或者

x.map { case (a, b) => "(" + a + ", " + b + ")" }

(使用模式匹配)。请注意,在这种情况下,需要使用大括号。

答案 1 :(得分:0)

您已经创建了一个元组数组。 Scala元组将固定数量的项目组合在一起,以便它们可以作为整体传递。与数组或列表不同,元组可以容纳不同类型的对象,但它们也是不可变的。

要访问元组的值,Scala提供._1._2以访问元组的值。 例如

scala> val tuple = (2,4)
tuple: (Int, Int) = (2,4)

scala> tuple._1
res11: Int = 2

scala> tuple._2
res12: Int = 4

如果元组中有两个以上的值,._ 3将用于获取元组的第三个值。

类似地,您创建了tuple2数组。

scala> val arr = Array((1,1), (2,4), (3,9))
arr: Array[(Int, Int)] = Array((1,1), (2,4), (3,9))

scala> arr.map(tuple => "(" + tuple._1 + "," + tuple._2 + ")" )
res13: Array[String] = Array((1,1), (2,4), (3,9))

使用模式匹配获取值的另一种方法。

scala> arr.map{
     | case (a: Int, b: Int) => "(" + a + "," + b + ")" }
res17: Array[String] = Array((1,1), (2,4), (3,9))

答案 2 :(得分:0)

对于Scala来说,int main(){ string default_file_name = "my_file.txt"; string file_name = get_from_commandline_args(); istream reader; // can't create this as constructor is private if(file_name == default_file_name) { ifstream fin; fin.open (file_name); reader = fin; } else { reader = cin; } while(true) { // read input string str; reader >> str; } } 实际上是一件事-映射到的Seq类型是一个有点不直观的怪癖,您以后可以/需要对其进行解构。幸运的是,正如其他人指出的那样,您可以使用模式匹配,为此,您需要将方括号替换为大括号并添加case关键字,例如istream等。

答案 3 :(得分:0)

该错误的原因已经由Alexey Romanov给出。如果您想使用模式匹配,也可以这样做:

x.map(v=>{val (a,b)=v;"(" + a + ", " + b + ")"})

在Scala REPL中:

scala> val x = Array((3,2), (4,5))
x: Array[(Int, Int)] = Array((3,2), (4,5))

scala> x.map(v=>{val (a,b)=v;"(" + a + ", " + b + ")"})
res2: Array[String] = Array((3, 2), (4, 5))