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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Scala上的類型不匹配以進(jìn)行理解

Scala上的類型不匹配以進(jìn)行理解

墨色風(fēng)雨 2019-11-12 14:49:21
為什么這種構(gòu)造會(huì)在Scala中導(dǎo)致類型不匹配錯(cuò)誤?for (first <- Some(1); second <- List(1,2,3)) yield (first,second)<console>:6: error: type mismatch; found   : List[(Int, Int)] required: Option[?]       for (first <- Some(1); second <- List(1,2,3)) yield (first,second)如果我用列表切換Some,它可以很好地編譯:for (first <- List(1,2,3); second <- Some(1)) yield (first,second)res41: List[(Int, Int)] = List((1,1), (2,1), (3,1))這也可以正常工作:for (first <- Some(1); second <- Some(2)) yield (first,second)
查看完整描述

3 回答

?
搖曳的薔薇

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

對(duì)于理解將轉(zhuǎn)換為對(duì)mapor flatMap方法的調(diào)用。例如這個(gè):


for(x <- List(1) ; y <- List(1,2,3)) yield (x,y)

變成:


List(1).flatMap(x => List(1,2,3).map(y => (x,y)))

因此,第一個(gè)循環(huán)值(在本例中為L(zhǎng)ist(1))將接收f(shuō)latMap方法調(diào)用。由于flatMap在List返回另一個(gè)List,的的理解,結(jié)果當(dāng)然會(huì)是一個(gè)List。(這對(duì)我來(lái)說(shuō)是新的:因?yàn)槔斫獠⒉豢偸菍?dǎo)致信息流,甚至不一定會(huì)導(dǎo)致Seqs。)


現(xiàn)在,看看如何flatMap在中聲明Option:


def flatMap [B] (f: (A) ? Option[B]) : Option[B]

請(qǐng)記住這一點(diǎn)。讓我們看看如何將理解錯(cuò)誤(帶有的錯(cuò)誤Some(1))轉(zhuǎn)換為一系列map調(diào)用:


Some(1).flatMap(x => List(1,2,3).map(y => (x, y)))

現(xiàn)在,很容易看到該flatMap調(diào)用的參數(shù)是按要求返回a List而不是返回的東西Option。


為了解決問(wèn)題,您可以執(zhí)行以下操作:


for(x <- Some(1).toSeq ; y <- List(1,2,3)) yield (x, y)

這樣編譯就可以了。值得注意的是,Option它不是Seq通常所假定的的子類型。


查看完整回答
反對(duì) 回復(fù) 2019-11-12
?
慕尼黑8549860

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊

一個(gè)容易記住的技巧,因?yàn)槔斫鈺?huì)嘗試返回第一個(gè)生成器的集合類型,在這種情況下為Option [Int]。因此,如果從Some(1)開(kāi)始,則應(yīng)該期望Option [T]的結(jié)果。


如果要獲取列表類型的結(jié)果,則應(yīng)從列表生成器開(kāi)始。


為什么有此限制,而不假定您總是需要某種順序?您可能會(huì)遇到需要返回的情況Option。也許你有一個(gè)Option[Int]你想要的東西結(jié)合起來(lái),得到一個(gè)Option[List[Int]],用下面的函數(shù)說(shuō):(i:Int) => if (i > 0) List.range(0, i) else None; 然后,您可以編寫此代碼,并在事情沒(méi)有“意義”時(shí)得到None:


val f = (i:Int) => if (i > 0) Some(List.range(0, i)) else None

for (i <- Some(5); j <- f(i)) yield j

// returns: Option[List[Int]] = Some(List(0, 1, 2, 3, 4))

for (i <- None; j <- f(i)) yield j

// returns: Option[List[Int]] = None

for (i <- Some(-3); j <- f(i)) yield j

// returns:  Option[List[Int]] = None

實(shí)際上,如何擴(kuò)展理解力實(shí)際上是將類型的對(duì)象M[T]與函數(shù)組合(T) => M[U]以獲得類型的對(duì)象的相當(dāng)通用的機(jī)制M[U]。在您的示例中,M可以是Option或List。通常,它必須是相同的類型M。因此,您不能將Option與List結(jié)合使用。有關(guān)可能存在的其他情況的示例M,請(qǐng)查看此特征的子類。


為什么結(jié)合List[T]與(T) => Option[T]工作雖然當(dāng)你開(kāi)始與列表?在這種情況下,庫(kù)在有意義的地方使用更通用的類型。因此,您可以將List與Traversable結(jié)合使用,并且存在從Option到Traversable的隱式轉(zhuǎn)換。


底線是:考慮要讓表達(dá)式返回哪種類型,并以該類型作為第一個(gè)生成器開(kāi)始。如有必要,將其包裝為該類型。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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