簡體   English   中英

斯卡拉下界類型“與”另一種類型?

[英]scala lower bound type “with” another type?

這是代碼

class Result[A] {
    def map[B](f: (Result[A] => Result[B]), xResult: Result[A]) = {
      xResult match {
        case Success(x)    => Success(f(xResult))
        case Failure(errs) => Failure(errs)
      }
    }

    def apply[B](fResult: Result[A], xResult: Result[B]) = {
      (fResult, xResult) match {
        case (Success(f), Success(x))        => Success((f, x))
        case (Failure(errs), Success(a))     => Failure(errs)
        case (Success(a), Failure(errs))     => Failure(errs)
        case (Failure(errs), Failure(errs2)) => Failure(List(errs, errs2))
      }
    }
  }

  case class Success[A](a: A) extends Result[A] {}

  case class Failure[A](a: A) extends Result[A] {}

  def createCustomerId(id: Int) = {
    if (id > 0)
      Success(id)
    else
      Failure("CustomerId must be positive")
  }

這是問題

1)從方法createCustomer的類型推斷得出的結果是這樣的

Product with Serializable with Result[_ >: Int with String] 

我對“帶有可序列化的產品”的東西沒有任何疑問,我想知道的是如何對結果進行有意義的處理,而出於好奇,如何初始化這樣的類型。

假設我有另一種方法,如下所示

def createCustomer(customerId: Result[_ >: Int with String], email: Result[String]) = {
    how can i read/do something with "customerId" argument
  }

如何初始化這樣的類型

val x: Result[Int with String] = ???

筆記:

  1. 我知道我的Result類沒有任何通用的“ getter”
  2. 我知道,如果id> 0時返回“ Success(id.ToString)”,也許方法“ createCustomerId”中的事情可能會更容易,但是我真的很想知道這種較低類型的情況以及如何利用(如果可能)在將來

問題是您的類型定義指出SuccessFailure采用相同的參數類型。 但是,您實際上想將其他類型的參數放入“ Failure同時仍然保持協方差。 這是最簡單的解決方法:

class Result[A] {

  def map[B](f: (Result[A] => Result[B]), xResult: Result[A]) = {
    xResult match {
      case Success(x) => Success(f(xResult))
      case Failure(errs) => Failure(errs)
    }
  }

  def apply[B](fResult: Result[A], xResult: Result[B]) = {
    (fResult, xResult) match {
      case (Success(f), Success(x)) => Success((f, x))
      case (Failure(errs), Success(a)) => Failure(errs)
      case (Success(a), Failure(errs)) => Failure(errs)
      case (Failure(errs), Failure(errs2)) => Failure(List(errs, errs2))
    }
  }
}

case class Success[A](a: A) extends Result[A] {}

case class Failure[A, B](a: B) extends Result[A] {}

object TestResult extends App {

  def createCustomerId(id: Int): Result[Int] = {
    if (id > 0)
      Success(id)
    else
      Failure("CustomerId must be positive")
  }

  println(createCustomerId(0))
  println(createCustomerId(1))
}

印刷品:

Failure(CustomerId must be positive)
Success(1)

如果您不使用Result[Int]注釋createCustomerId返回類型,則編譯器將Result[_ <: Int] with Product with Serializable來推斷Result[_ <: Int] with Product with Serializable這可能不理想,但也不太差。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM