scala 无法推断参数的类型

8qgya5xd  于 2023-01-02  发布在  Scala
关注(0)|答案(2)|浏览(170)

我已经创建了MyList抽象类来实现列表,没有使用现有列表实现的原因是我正在学习Scala,这是同一门课程的练习。我正在编写一个zipWith函数来创建一个新的列表,并将各个项连接起来,例如:
列表1:列表= [1,2,3]
列表2:字符串列表= ["Hello", "This is", "Scala"]
我希望输出如下:[1-Hello, 2-This is, 3-Scala]
我编写了zipWith函数,如下所示:

override def zipWith[B, C](list: MyList[B], zip: (A, B) => C): MyList[C] = {
    if(list.isEmpty) throw  new RuntimeException("Lists do not have the same length")
    else new Cons(zip(h, list.head), t.zipWith(list.tail, zip))
  }

我试着用这个语句调用这个函数:

println(list.zipWith[String, String](listOfStrings, (Int,String)=>_+"-"+_))

但我得到一个错误:
我无法推断扩展函数的参数 $3的类型:($3,$4)=〉$3 +“-”+ _$4。
该变量的类型明确表示为Int,但我仍然收到此错误。这可以使用以下方法解决:

println(list.zipWith[String, String](listOfStrings, _+"-"+_))

我不能理解为什么前面的语句失败,即使在给出了所需变量的类型之后

2g32fytz

2g32fytz1#

语法(Int,String)=>_+"-"+_并不意味着您所想的那样。
它表示一个函数,该函数带有两个名称未知但类型未知的参数:(Int: ???, String: ???) => _+"-"+_.
因此,编译器会引发错误,因为它确实没有关于类型的线索。
您应该:

  • 使用显式变量名编写它:(i: Int, s: String) => s"$i-$s".(注意插值法的使用,推荐使用插值法而不是int和string相加),
  • 或者像这样单独声明函数:val f: (Int, String) => String = _+"-"+_.
x3naxklr

x3naxklr2#

我认为编译器搞不清哪一个变量与每个下划线匹配。下面这个显式表达式对我很有效:

println(list.zipWith[String, String](listOfStrings, (a:Int, b:String) => a+"-"+b))

相关问题