【问题标题】:scala: missing parameter type for expanded function: the argument types of an anonymous function must be fully knownscala:缺少扩展函数的参数类型:匿名函数的参数类型必须是完全已知的
【发布时间】:2017-12-12 01:53:24
【问题描述】:

我是 scala 的新手,我完全不知道我的代码有什么问题:

我有一些Future 可能会抛出异常:

var clean: Future[Boolean];

但是,当我尝试映射时

clean.map( b => {
  case true => Ok("success")
  case false => Ok("failed")
}).recover {
  case t => Ok("error: " + t)
}

我得到标题中指定的编译错误..我完全不知道我的代码的确切位置和/哪部分导致它..我已经用谷歌搜索但很难找到任何线索,因为 scala 语法非常灵活因此互联网上有这么多的变化,但我得到的错误是相当误导......

任何帮助将不胜感激...

【问题讨论】:

    标签: scala playframework future


    【解决方案1】:

    你传递给.map的函数应该接受一个布尔参数b,并返回另一个函数(花括号中的东西)。编译器无法猜测该内部函数的类型,因此它抱怨参数类型未知。

    这实际上是一件好事,因为这根本不是你真正想要写的。

    只需删除整个(b => ...) 业务:

    clean.map { 
      case true => Ok("success")
      case false => Ok("failed") 
    }.recover { 
      case t => Ok("error: " + t)
    }
    

    另外,使用clean val 而不是var。可变变量不是一个好主意。 99% 的时间,在 scala 中编写代码,你不应该需要它们,所以,我建议你暂时假装 var 关键字根本不存在,直到你学得足够好,能够确定实际需要可变状态的 1% 的情况。

    【讨论】:

    • 非常感谢您的额外建议! Scala 松散的语法和灵活性让我着迷,我会听从这个建议。顺便说一句,有没有办法让 scala 清楚地“知道”内部函数的类型?我尝试了 'b: Boolean' 或 '(b: Boolean => Future[Response])' 都无济于事。通过从中删除更多信息很难掌握“修复'丢失某些信息'错误”......
    • 你不懂。您不是“通过删除信息来修复缺失”,而是完全改变了所写内容的含义。 b 与内部函数无关(它的类型实际上是众所周知的)。您的代码中有两个函数:一个传递给map 的函数将b 作为参数并返回另一个函数,第二个函数的类型未知。像 .map { b => { x: Boolean => ... }) 这样的东西会“修复”它,但是,就像我说的,这根本不是你想要的 - 你最终会得到 Futurefunction
    【解决方案2】:

    我猜你是故意的:

    clean.map( b => b match {
     case true => Ok("success")
     case false => Ok("failed")
    }).recover {
     case t => Ok("error: " + t)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      相关资源
      最近更新 更多