Scala从lambda获得价值

时间:2017-09-25 19:56:34

标签: scala lambda functional-programming

我想从作为参数传递的函数中获取值并返回Option [Int],之后如果我有None抛出异常并且在任何其他情况下返回值 我试着这样做:

def foo[T](f: T => Option[Int]) = {
   def helper(x: T) = f(x)
   val res = helper _
   res match {
       case None => throw new Exception()
       case Some(z) => z
}

我称之为:

val test = foo[String](myFunction(_))
test("Some string")

我在匹配部分中有不匹配类型的编译错误(某些[A]传递 - [T] =>需要选项[Int]) 据我所知,res变量是对函数的引用,我无法将它与可选的调用get \ gerOrElse方法相匹配。 此外,我可能只是不知道下划线如何工作并做了一些非常错误的事情,我在这里使用它将一些东西作为参数传递给函数f,你能解释一下我犯了哪个错误吗?

1 个答案:

答案 0 :(得分:2)

helper是一种获取T并返回Option[Int]的方法。

res是一个函数T => Option[Int]

Difference between method and function in Scala

您无法将功能T => Option[Int]NoneSome(z)匹配。

您应该有一个Option[Int](例如应用于某些T的函数)来进行此类匹配。

可能你想要

  def foo[T](f: T => Option[Int]) = {
    def helper(x: T) = f(x)
    val res = helper _
    (t: T) => res(t) match {
      case None => throw new Exception()
      case Some(z) => z
    }
  }

或只是

  def foo[T](f: T => Option[Int]): T => Int = {
    t => f(t) match {
      case None => throw new Exception()
      case Some(z) => z
    }
  }

  def foo[T](f: T => Option[Int]): T => Int = 
    t => f(t).getOrElse(throw new Exception())