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