2016-01-13 86 views
-2
  1. 你能解釋一下爲什麼第一個定義與下一個定義相比是錯誤的?斯卡拉折左找到倒數第二個元素

  2. 爲什麼寫((r._2,c))._1會取我倒數第二個元素?

  3. 請給我一個跟蹤如何在(r,c)或其意義插入元素。

下面是代碼:

scala> def penpen [A] (list:List[A]):A = { 
    list.foldLeft((list.head, list.tail.head))((r, c) => (r,c))._1 
} 

8: error: type mismatch; 
found : r.type (with underlying type (A, A)) 
required: A 
list.foldLeft((list.head, list.tail.head))((r, c) => (r,c))._1 
                  ^

scala> def penpen [A] (list:List[A]):A = { 
    list.foldLeft((list.head, list.tail.head))((r, c) =>(r._2,c))._1 
} 
penpen: [A](list: List[A])A 
+3

正如你應該是一個開發商能夠將問題分解成更小的部分以瞭解它的工作原理。你應該也能夠調試它。如果你不明白'A'和'(A,A)'之間的區別,請首先了解它。看看'foldLeft'簽名,隨處放入println並按照類型輸入... –

回答

2

讓我們先看看foldLeft簽名:

def foldLeft[B](z: B)(f: (B, A) ⇒ B): B 

所以它需要一個類型參數:B。當你指定第一個參數組時(你的情況爲(list.head, list.tail.head),你正在修正這個參數的東西類型,你傳遞的參數的類型是(A,A),所以現在,在簽名中,我們可以用前面說的B,So代替(A,A)改寫,foldLeft的簽名是:

def foldLeft(z: (A,A))(f: (A,A),A => (A,A)): (A,A) 

所以第二個參數組需要一個函數,它有兩個參數,一個(A,A)A,並且必須返回一個(A,A)

你通過這個功能。第二個參數是:

(r, c) => (r,c) 

所以我們結合r第一個參數,所以r將有類型(A,A)。我們結合c到第二個參數,它的類型是A,那麼返回的元組(r,c),其類型爲((A,A),A),但是這個函數的返回類型應該是(A,A),不((A,A),A)

+0

感謝您的回覆!這是非常明確的解釋。 –

+0

如果只是有一種方式來顯示您的認可,那麼我可以賺到我的虛擬互聯網點 – stew