我是Scala的新手,无法正常使用此代码,任何帮助都将不胜感激!这就是我所拥有的
if(isAdded()) {
motiveAdapter = new QuoteAdapter(getActivity().getApplicationContext(), qItems);
motiveRecycler.setAdapter(motiveAdapter);
}
我不明白为什么它不能推断出类型,因为list是List [Int](A),而foldRight的第二个arg是Int(B)。有什么想法吗?
答案 0 :(得分:0)
Scala编译器需要帮助
此处Scala编译器无法为您推断类型,因为+
可以是字符串连接运算符或数字加法运算符。要消除这种混淆,您必须至少提供B
作为Int
的输出类型。
您需要至少告诉B
所属的类型,以帮助编译器知道天气+
是字符串连接或数字加法。
告诉编译器什么是B
(结果类型)或告诉编译器什么是x
和y
list.foldRight[Int]( (x, y) => x + y , acc )
代码下方
println(list.foldRight[Int]( (x, y) => x + y , acc ) )
Scala REPL
scala> :paste
// Entering paste mode (ctrl-D to finish)
sealed trait List[+A] {
def foldRight[B](f: (B, A) => B, acc: B): B = {
def go(acc: B, list: List[A]): B = list match {
case Nil => acc
case Cons(x, xs) => go(f(acc, x), xs)
}
go(acc, this)
}
}
case object Nil extends List[Nothing]
case class Cons[+A](x: A, xs: List[A]) extends List[A]
val list: List[Int] = Cons(1, Cons(2, Cons(3, Cons(4, Nil))))
val acc: Int = 0
// Exiting paste mode, now interpreting.
defined trait List
defined object Nil
defined class Cons
list: List[Int] = Cons(1,Cons(2,Cons(3,Cons(4,Nil))))
acc: Int = 0
scala> println(list.foldRight[Int]( (x, y) => x + y , acc ) )
10
答案 1 :(得分:0)
在scala中使用lambda函数而不显式指定类型的惯用方法是case
:
println(list.foldRight({ case (x, y) => x + y }, acc))