Scala 如何使用curry函数

Scala 如何使用curry函数,scala,Scala,我在对象上有一个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 =

我在对象上有一个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)

  }
}
但是我不知道,如何通过第三个参数。

你可以这样做:

  val a: Sum[Int, Int] = Left(5)
  val l = Sum.fold(a)(l => l * l)(l => l * l)

您需要同时指定
Sum
A
B
类型,编译器可以推断
A
B
类型

作为您的代码段,您只需将
Left
A
类型指定为
Int
而不指定
B
类型,编译器无法推断
B
类型,因此对于第三个高阶函数参数,在编译时,编译器将在此处失败。

您可以这样做:

  val a: Sum[Int, Int] = Left(5)
  val l = Sum.fold(a)(l => l * l)(l => l * l)

您需要同时指定
Sum
A
B
类型,编译器可以推断
A
B
类型


作为您的代码段,您只需将
Left
A
类型指定为
Int
而不指定
B
类型,编译器无法推断
B
类型,因此对于第三个高阶函数参数,在编译时,编译器将在此处失败。

您只需为
右侧的
函数指定一个显式类型:

 val l = Sum.fold(Left(5))(a => a * a)((b: Int) => b * b)

对于
right
函数,您只需为B指定一个显式类型:

 val l = Sum.fold(Left(5))(a => a * a)((b: Int) => b * b)