我在对象上有一个curried函数:
sealed trait Sum[A, B]
final case class Left[A, B](value: A) extends Sum[A, B]
final case class Right[A, B](value: B) extends Sum[A, B]
object Sum {
def fold[A, B, C](s: Sum[A, B])(left: A => C)(right: B => C): C =
s match {
case Left(v) => left(v)
case Right(v) => right(v)
}
}
如何使用折叠功能?我尝试了如下:
object Main {
def main(args: Array[String]): Unit = {
val l = Sum.fold(Left(5))(l => l * l)
}
}
但我不知道,如何传递第三个论点。
答案 0 :(得分:3)
你这样做:
val a: Sum[Int, Int] = Left(5)
val l = Sum.fold(a)(l => l * l)(l => l * l)
OR
val l = Sum.fold(Left[Int, Int](5))(l => l * l)(l => l * l)
您需要指定Sum
的{{1}}和A
类型,因为编译器可以推断B
和Left
Right
和{{ 1}}类型。
作为您的代码段,您只需将A
B
类型指定为Left
而没有A
类型,编译器无法推断出Int
类型,对于您的第三个高阶函数参数,在编译时中,编译器将在此处失败。
答案 1 :(得分:0)
您只需要为right
函数为B提供显式类型:
val l = Sum.fold(Left(5))(a => a * a)((b: Int) => b * b)