簡體   English   中英

調用toSet是否缺少參數類型錯誤?

[英]Missing parameter type error by calling toSet?

嘗試從字符列表中生成映射到其頻率的唯一字符列表 - 例如:

List('a','b','a') -> List(('a',2), ('b',1))

所以,只是在控制台中亂竄,這有效:

val l = List('a', 'b', 'c', 'b', 'c', 'a')       
val s = l.toSet                                  
s.map(i => (i, l.filter(x => x == i).size))

但是,僅通過組合最后2行縮短不?

l.toSet.map(i => (i, l.filter(x => x == i).size)) 

給出錯誤“缺少參數類型”。

有人可以解釋為什么Scala會抱怨這種語法嗎?

當你說val s = l.toSet編譯器數字,唯一明智的類型toSetChar凹口-是最具體的選擇。 然后,假設s是一組Char ,編譯器意識到映射必須來自Char

但在第二種情況下,它拒絕判斷toSet的元素類型是什么。 它可能是Char ,但AnyVal也可以, Any也可以。

l.toSet.map((i: Any) => (i, l.filter(x => x == i).size))

通常規則是編譯器應該選擇最具體的值。 但是由於函數在它們的參數中是逆變的,所以當它們將Any作為參數時它們是最具體的,因此編譯器無法決定。 可能存在打破平局的規則(“更喜歡早期假設”),但沒有實施。 所以它要求你的幫助。

您可以在函數參數或toSet上提供類型來解決問題:

l.toSet.map((i: Char) => (i, l.filter(x => x == i).size))
l.toSet[Char].map(i => (i, l.filter(x => x == i).size))

將類型[Char]添加到toSet可以解決問題。

scala> l.toSet[Char].map(i => (i, l.filter(x => x == i).size))
scala.collection.immutable.Set[(Char, Int)] = Set((a,2), (b,2), (c,2))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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