以下Scala代码:
val l = List((1,2),(2,3),(3,4))
def fun1(t1: Int,t2: Int) = (t1+1,t2)
l map fun1
给出错误:
Error:(3, 8) type mismatch;
found : (Int, Int) => (Int, Int)
required: ((Int, Int)) => ?
l map fun1;}
^
我想知道为什么map必须有一个其codomain没有推断类型的函数......
答案 0 :(得分:6)
这不是关于codomain,它是错误的函数arity。方法map
期望一个函数只有一个参数,即使这个参数是一个元组:
((Int, Int)) => (Int, Int) // Function[(Int, Int), (Int, Int)]
但是你传递的函数有两个参数(两个整数):
(Int, Int) => (Int, Int) // Function2[Int, Int, (Int, Int)]
做到这一点:
def fun1(t: (Int, Int)) = (t._1+1, t._2)
l map fun1
或者这个:
def fun1(t1: Int,t2: Int) = (t1+1,t2)
l map { case (x, y) => fun1(x, y) }
答案 1 :(得分:3)
您必须使用case
来破坏元组。
val l = List((1,2),(2,3),(3,4))
def fun1(t1: Int,t2: Int) = (t1+1,t2)
l map { case (a, b) => fun1(a, b) }
但是,如果你声明你的功能如下,那么它可以正常工作
def fun1(t: (Int, Int)) = (t._1 + 1,t._2)
l map fun1