亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

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

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

如何定義“類型分離”(聯合類型)?有一種方法建議處理重載方法的雙重定義是將重載替換為模式匹配:object Bar {    def foo(xs: Any*) = xs foreach {        case _:String => println("str")       case _:Int => println("int")       case _ => throw new UglyRuntimeException()    }}這種方法要求我們提交對參數的靜態類型檢查。foo..如果能寫的話會好得多object Bar {    def foo(xs: (String or Int)*) = xs foreach {       case _: String => println("str")       case _: Int => println("int")    }}我可以接近Either,但它很快就會變得丑陋,有兩種以上的類型: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")    }}它看起來像是一個通用的(優雅的,高效的)解決方案需要定義Either3, Either4..有誰知道實現同樣目的替代解決方案嗎?據我所知,Scala沒有內置的“類型分離”。另外,上面定義的隱式轉換是否潛伏在某個標準庫中,以便我只需導入它們?
查看完整描述

3 回答

?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

嗯,在具體的案例中Any*,下面這個技巧不會起作用,因為它不會接受混合類型。但是,由于混合類型也不能處理重載,所以這可能是您想要的。

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

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

接下來,聲明foo就像這樣:

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

僅此而已。你可以打電話foo(5)foo("abc"),它會起作用的,但是試一試foo(true)就會失敗??蛻舳舜a可以通過創建StringOrInt[Boolean],除非,如蘭德爾下面,你做StringOrIntsealed班級,等級。

它起作用是因為T: StringOrInt意味著有一個隱式參數StringOrInt[T],因為Scala在類型的伴生對象中查找,以查看是否存在使請求該類型的代碼工作的隱式。


查看完整回答
反對 回復 2019-07-08
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

下面是Rex Kerr編碼聯合類型的方法。直截了當!

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)
        ^

資料來源:第27條評論這,這個MilesSabin的優秀博客文章提供了在Scala中編碼聯合類型的另一種方式。


查看完整回答
反對 回復 2019-07-08
  • 3 回答
  • 0 關注
  • 463 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號