2014-11-24 26 views
1

試圖編譯下面的函數在階2.11.0Scala的 - 與類型推斷麻煩lambda表達式

def dafuq(canvas: Array[Array[Boolean]]): Array[Array[Boolean]] = { 
     for (r <- canvas.reverse) yield r.zipWithIndex.map((c: Boolean, i: Int) => c) 
} 

產生

Solution.scala:6: error: type mismatch; 
    found : (Boolean, Int) => Boolean 
    required: ((Boolean, Int)) => ? 
     for (r <- canvas.reverse) yield r.zipWithIndex.map((c: Boolean, i: Int) => c) 
                       ^

功能是假的,但它示出了我有一個問題遇到。我對Scala很陌生,所以這可能是一個新手的錯誤,但我找不到解決方案或解釋這個問題。你知道是什麼原因導致上述行爲?

也是返回類型暗示可能的lambda表達式?

回答

3

我也遇到過很多次這個編譯錯誤,但它不是一個類型推斷問題。你提供了一個具有2個參數的匿名函數,但編譯器期望一個具有單個元組參數的函數。 2個解決方案:

def dafuq(canvas: Array[Array[Boolean]]): Array[Array[Boolean]] = { 
     for (r <- canvas.reverse) yield r.zipWithIndex.map(ci => ci._1) 
} 

def dafuq(canvas: Array[Array[Boolean]]): Array[Array[Boolean]] = { 
     for (r <- canvas.reverse) yield r.zipWithIndex.map { case (c, i) => c } 
} 

在第一溶液ci推斷到一對(Boolean, Int)。在第二種解決方案中,我們使用模式匹配表達式。

也是返回類型暗示可能的lambda表達式?

我不知道,但您可以在任何表達式上添加類型註釋。例如:case (c, i) => c: Boolean

+3

第二個片段使用模式匹配表達式來定義函數。它不是'部分功能';它是一個'Function1'(它不是部分的,因爲它是在整個域中定義的)。 [SLS](http://www.scala-lang.org/docu/files/ScalaReference.pdf)第8.5節指定根據上下文,模式匹配表達式可以解析爲「FunctionN」或「PartialFunction」。在這種情況下,由於'map'需要一個'Function1',就是這樣。 – 2014-11-24 23:30:29

+0

你說得對,我要編輯答案。 :) – Dimitri 2014-11-24 23:37:46

+0

我只知道這個,因爲其他人已經糾正了我的計算器之前,所以...繼續傳遞它:) – 2014-11-24 23:44:24