2017-07-07 87 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