如何使用咖喱功能

时间:2017-04-01 05:35:53

标签: 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 =
    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)

  }
}

但我不知道,如何传递第三个论点。

2 个答案:

答案 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类型,因为编译器可以推断BLeft Right和{{ 1}}类型。

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

答案 1 :(得分:0)

您只需要为right函数为B提供显式类型:

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