我定义以下变量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))
?
答案 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> 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))