【问题标题】:Scala get value from lambdaScala 从 lambda 中获取价值
【发布时间】:2018-03-06 21:29:24
【问题描述】:

我想从作为参数传递的函数中获取值并返回 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] => 需要 Option[Int]) 据我了解 res 变量是对函数的引用,我无法将它与可选的调用 get\gerOrElse 方法匹配。 此外,我可能只是不明白下划线是如何工作的并且做错了什么,我在这里使用它来将某个东西作为参数传递给函数 f,你能解释一下我在哪里犯了错误吗?

【问题讨论】:

  • 抱歉,在 val test = ... 之后无法编辑问题。我还使用一些参数调用测试,例如 test("aaaa")
  • 可以编辑问题。它下面有一个编辑按钮。
  • myFunction 的签名是什么样的?它似乎与 foo 的输入不匹配。
  • 你说你想要一个Option[Int] 输出。您期望给定输入的Int 值是多少?
  • @Tanjin def myFunction(digits: String): Option[Int] = if(digits.matches("[0-9]*")) Some(digits.toInt) else None

标签: scala lambda functional-programming


【解决方案1】:

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())

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 2013-04-11
    • 2020-11-07
    • 2018-09-14
    相关资源
    最近更新 更多