[英]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
編譯器數字,唯一明智的類型toSet
是Char
凹口-是最具體的選擇。 然后,假設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.