第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用.toSet生成的Set上的類型推斷失?。?/h1>

使用.toSet生成的Set上的類型推斷失?。?/h1>
慕絲7291255 2019-11-19 14:28:08
為什么類型推斷在這里失?。縮cala> val xs = List(1, 2, 3, 3)xs: List[Int] = List(1, 2, 3, 3)scala> xs.toSet map(_*2)<console>:9: error: missing parameter type for expanded function ((x$1) => x$1.$times(2))       xs.toSet map(_*2)但是,如果xs.toSet已分配,它將進(jìn)行編譯。scala> xs.toSetres42: scala.collection.immutable.Set[Int] = Set(1, 2, 3)scala> res42 map (_*2)res43: scala.collection.immutable.Set[Int] = Set(2, 4, 6)同樣,采用另一種方法,Set從轉(zhuǎn)換為List,并映射為List。scala> Set(5, 6, 7)res44: scala.collection.immutable.Set[Int] = Set(5, 6, 7)scala> res44.toList map(_*2)res45: List[Int] = List(10, 12, 14)
查看完整描述

3 回答

?
肥皂起泡泡

TA貢獻(xiàn)1829條經(jīng)驗 獲得超6個贊

我同意推斷“唯一可能的”類型會很好,即使調(diào)用是鏈接在一起的,但存在技術(shù)限制。

您可以將推理視為對表達(dá)式的廣度優(yōu)先掃描,收集對類型變量的約束(由子類型邊界和必需的隱式參數(shù)引起),然后求解這些約束。這種方法允許例如隱式指導(dǎo)類型推斷。在您的示例中,即使僅查看xs.toSet子表達(dá)式也有一個解決方案,但是以后的鏈接調(diào)用可能會引入使系統(tǒng)無法滿足的約束。保留類型變量未解決的缺點是,對閉包的類型推斷需要知道目標(biāo)類型,因此將失?。ㄋ枰鲆恍┚唧w的事情-所需的閉包類型及其參數(shù)類型必須并非兩者都是未知的)。

現(xiàn)在,當(dāng)延遲解決約束使推理失敗時,我們可以回溯,解決所有類型變量,然后重試,但是實現(xiàn)起來很棘手(可能效率很低)。


查看完整回答
反對 回復(fù) 2019-11-19
?
ITMISS

TA貢獻(xiàn)1871條經(jīng)驗 獲得超8個贊

類型推斷無法正常工作,因為List#toSetis 的簽名


def toSet[B >: A] => scala.collection.immutable.Set[B]

并且編譯器需要在調(diào)用中的兩個位置推斷類型。在函數(shù)中注釋參數(shù)的另一種方法是toSet使用顯式類型參數(shù)進(jìn)行調(diào)用:


xs.toSet[Int] map (_*2)

更新:


關(guān)于您的問題,為什么編譯器可以分兩步進(jìn)行推斷,讓我們看一下一一行地輸入行時會發(fā)生什么:


scala> val xs = List(1,2,3)

xs: List[Int] = List(1, 2, 3)


scala> val ys = xs.toSet   

ys: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

在這里,編譯器會推斷出最具體類型,ys這是Set[Int]在這種情況下?,F(xiàn)在已經(jīng)知道這種類型,因此map可以推斷傳遞給函數(shù)的類型。


如果在示例中填寫了所有可能的類型參數(shù),則調(diào)用將寫為:


xs.toSet[Int].map[Int,Set[Int]](_*2)

第二個type參數(shù)用于指定返回的集合的類型(有關(guān)詳細(xì)信息,請查看Scala集合的實現(xiàn)方式)。這意味著我什至低估了編譯器必須推斷的類型數(shù)量。


在這種情況下,似乎很容易推斷出來,Int但在某些情況下卻并非如此(鑒于Scala的其他功能,例如隱式轉(zhuǎn)換,單例類型,混合的特性等)。我并不是說這無法完成-只是Scala編譯器沒有做到這一點。


查看完整回答
反對 回復(fù) 2019-11-19
  • 3 回答
  • 0 關(guān)注
  • 472 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號