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

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

如何定義“類型分離”(聯(lián)合類型)?

如何定義“類型分離”(聯(lián)合類型)?

如何定義“類型分離”(聯(lián)合類型)?有一種方法建議處理重載方法的雙重定義是將重載替換為模式匹配:object Bar {    def foo(xs: Any*) = xs foreach {        case _:String => println("str")       case _:Int => println("int")       case _ => throw new UglyRuntimeException()    }}這種方法要求我們提交對(duì)參數(shù)的靜態(tài)類型檢查。foo..如果能寫的話會(huì)好得多object Bar {    def foo(xs: (String or Int)*) = xs foreach {       case _: String => println("str")       case _: Int => println("int")    }}我可以接近Either,但它很快就會(huì)變得丑陋,有兩種以上的類型:type or[L,R] = Either[L,R]implicit def l2Or[L,R](l: L): L or R = Left(l)implicit def r2Or[L,R](r: R): L or R = Right(r)object Bar {    def foo(xs: (String or Int)*) = xs foreach {       case Left(l) => println("str")       case Right(r) => println("int")    }}它看起來(lái)像是一個(gè)通用的(優(yōu)雅的,高效的)解決方案需要定義Either3, Either4..有誰(shuí)知道實(shí)現(xiàn)同樣目的替代解決方案嗎?據(jù)我所知,Scala沒(méi)有內(nèi)置的“類型分離”。另外,上面定義的隱式轉(zhuǎn)換是否潛伏在某個(gè)標(biāo)準(zhǔn)庫(kù)中,以便我只需導(dǎo)入它們?
查看完整描述

3 回答

?
慕容708150

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

嗯,在具體的案例中Any*,下面這個(gè)技巧不會(huì)起作用,因?yàn)樗粫?huì)接受混合類型。但是,由于混合類型也不能處理重載,所以這可能是您想要的。

首先,使用您希望接受的類型聲明一個(gè)類,如下所示:

class StringOrInt[T]object StringOrInt {
  implicit object IntWitness extends StringOrInt[Int]
  implicit object StringWitness extends StringOrInt[String]}

接下來(lái),聲明foo就像這樣:

object Bar {
  def foo[T: StringOrInt](x: T) = x match {
    case _: String => println("str")
    case _: Int => println("int")
  }}

僅此而已。你可以打電話foo(5)foo("abc"),它會(huì)起作用的,但是試一試foo(true)就會(huì)失敗。客戶端代碼可以通過(guò)創(chuàng)建StringOrInt[Boolean],除非,如蘭德爾下面,你做StringOrIntsealed班級(jí),等級(jí)。

它起作用是因?yàn)?/trans>T: StringOrInt意味著有一個(gè)隱式參數(shù)StringOrInt[T],因?yàn)镾cala在類型的伴生對(duì)象中查找,以查看是否存在使請(qǐng)求該類型的代碼工作的隱式。


查看完整回答
反對(duì) 回復(fù) 2019-07-08
?
紅糖糍粑

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

下面是Rex Kerr編碼聯(lián)合類型的方法。直截了當(dāng)!

scala> def f[A](a: A)(implicit ev: (Int with String) <:< A) = a match {
     |   case i: Int => i + 1
     |   case s: String => s.length     | }f: [A](a: A)(implicit ev: <:<[Int with String,A])Intscala> f(3)res0:
      Int = 4scala> f("hello")res1: Int = 5scala> f(9.2)<console>:9: error: Cannot prove that Int with String <:< Double.
       f(9.2)
        ^

資料來(lái)源:第27條評(píng)論這,這個(gè)MilesSabin的優(yōu)秀博客文章提供了在Scala中編碼聯(lián)合類型的另一種方式。


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

添加回答

舉報(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)