簡體   English   中英

流中的類型推斷

[英]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′iui替換而來用新鮮的標識符和下划線e′從結果e通過替換各個強調部uiu′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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM