2017-07-07 126 views
1

我是新来的Scala,我根本不知道到底什么是错我的代码:阶:缺少参数类型扩展功能:参数类型的匿名函数必须充分了解

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

var clean: Future[Boolean]; 

然而,当我尝试映射

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

我得到编译标题指定的错误。我完全不知道在哪里和/ PA哪些我的代码rt完全导致它..我GOOGLE了,但它很难找到任何线索,因为斯卡拉语法是如此灵活,因此在互联网上的这么多变化,但我得到的错误是相当误导...

任何帮助将非常感激......

回答

4

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

这实际上是一件好事,因为它不是你真正想写的东西。

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

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

此外,还要cleanval而非var。可变变量不是一个好主意。 99%的时间,在scala编写代码,你不应该需要它们,所以,我建议你现在假装var关键字根本不存在,直到你学习到足够的语言以便能够识别实际需要可变状态的情况下有1%。

+0

非常感谢您对额外的意见!斯卡拉松散的语法和灵活性已经得到了我的一窍不通,我会听从这个建议..顺便说一下,有没有办法让scala明确地知道内部函数的类型?我试过'b:Boolean'或'(b:Boolean => Future [Response])'都无济于事。通过从中删除更多信息很难掌握“修复”缺少一些信息的“错误”...... – Zennichimaro

+1

你不明白。你不是“通过删除信息来修复缺失”,你正在改变完全写作内容的含义。 'b'与内部函数无关(其类型实际上非常知名)。在你的代码中有两个函数:你传递给'map'的函数将'b'作为参数并返回ANOTHER函数,这是第二个类型未知的函数。像这样的'.map {b => {x:Boolean => ...})'会“修复”它,但正如我所说的,这完全不是你想要的 - 你最终会“功能”的“未来”。 – Dima

2

我猜你打算:

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

谢谢!这实际上使它更清晰! – Zennichimaro