當我建立使用foldLeft
列表我經常生氣在不必明確鍵入注入參數,並希望我可以只使用'無」來代替 - 這裏是一個人爲的例子:爲什麼不通過零來摺疊工作?
scala> List(1,2,3).foldLeft(List[Int]())((x,y) => y :: x)
res17: List[Int] = List(3, 2, 1)
scala> List(1,2,3).foldLeft(Nil)((x, y) => y :: x)
<console>:10: error: type mismatch;
found : List[Int]
required: scala.collection.immutable.Nil.type
List(1,2,3).foldLeft(Nil)((x,y) => y :: x)
這並沒有那麼糟與List[Int]
,但只要你開始使用你自己的類的列表,它幾乎肯定會有更長的名字,甚至是元組或其他容器的列表,所以你需要指定多個類名,這是非常可怕的:
list.foldLeft(List.empty[(SomethingClass, SomethingElseClass)]) { (x,y) => y :: x }
我猜測re儘管它不起作用,但是如果使用類似5 :: Nil
的東西,編譯器可以推斷出空列表的類型爲List[Int]
,但是當Nil
作爲參數傳遞給foldLeft
時,它沒有足夠的信息來這樣做,並且它被設置爲使用其類型的時間。但是 - 它真的不可以嗎?它不能推斷作爲第二個參數傳遞函數的返回類型的類型嗎?
如果不是,是否有一些我不知道的整潔的成語?
令人遺憾的是,Scala無法推斷出這類情況的類型。希望今後能對此進行修改。 – 2012-03-20 14:01:05
在實踐中應該不是太多問題。如果你只是處理一些特定的類,可以在頂部輸入一個類型別名,類型爲S =(SomethingClass,SomethingElseClass)或val nil = List.empty [(SomethingClass,SomethingElseClass)]。如果你正在編寫一個通用的方法,你的類型將已經有了簡短的別名,比如'T'和'U'。 – 2012-03-20 17:17:32