[英]Type Inference in Stream
為何編譯器無法在filter
器中推斷通配符的類型?
scala> Stream.from(1) takeWhile(_ < 1000) filter ( ( _ % 3 == 0) || ( _ % 5 == 0)) sum
<console>:18: error: missing parameter type for expanded function ((x$2) => x$2.$percent(3).$eq$eq(0))
Stream.from(1) takeWhile(_ < 1000) filter ( ( _ % 3 == 0) || ( _ % 5 == 0)) sum
這很好用:
scala> Stream.from(1).takeWhile( x => x < 1000).filter(x => (x % 3 == 0) || (x % 5 == 0)).sum
從SLS 6.23.1開始 :
如果表達式e按此順序綁定下划線部分
u1,…,un
,則等效於匿名函數(u′1, ... u′n) => e′
,其中每個u′i
由ui
替換而來用新鮮的標識符和下划線e′
從結果e
通過替換各個強調部ui
由u′i
。
這意味着使用占位符語法的多個下划線表示具有多個參數的匿名函數。
即
(_ > 0)
擴展為(x => x > 0)
(_ > 0 || _ < -10)
擴展為((x, y) => x > 0 || y < -10)
(_ > 0 || _ < -10 || _ % 2 == 0)
擴展為((x, y, z) => x > 0 || y < -10 || z % 2 == 0)
等等。該錯誤有點令人困惑,因為它似乎正在嘗試根據錯誤消息將其讀取為每套括號內的arity-1函數。 我推測它不知道如何處理表達式x => a || y => b
x => a || y => b
推斷類型,以某種方式得出Int => Boolean
。
_
每個后續實例都引用下一個參數。 如果要重用lambda的參數,則必須像在發布的第二版中一樣命名。
廢止的第一個版本更像
filter ((x,y) => ( x % 3 == 0) || ( y % 5 == 0))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.