我已经创建了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, _+"-"+_))
我不能理解为什么前面的语句失败,即使在给出了所需变量的类型之后
2条答案
按热度按时间2g32fytz1#
语法
(Int,String)=>_+"-"+_
并不意味着您所想的那样。它表示一个函数,该函数带有两个名称未知但类型未知的参数:
(Int: ???, String: ???) => _+"-"+_
.因此,编译器会引发错误,因为它确实没有关于类型的线索。
您应该:
(i: Int, s: String) => s"$i-$s"
.(注意插值法的使用,推荐使用插值法而不是int和string相加),val f: (Int, String) => String = _+"-"+_
.x3naxklr2#
我认为编译器搞不清哪一个变量与每个下划线匹配。下面这个显式表达式对我很有效: