如何使用咖喱功能
问题描述:
我有对象上的咖喱功能:如何使用咖喱功能
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)
OR
val l = Sum.fold(Left[Int, Int](5))(l => l * l)(l => l * l)
必须同时指定Sum
的A
和B
类型编译器可以推断Left
和Right
A
和B
类型。
由于您的代码段,你只需指定Left
A
类型Int
没有B
类型,编译器不能推断B
类型,因此关于你的第三高阶功能参数,在编译时,编译器会在这里失败。
答
你只需要给出一个明确的类型为B为right
功能:
val l = Sum.fold(Left(5))(a => a * a)((b: Int) => b * b)