簡體   English   中英

返回嘗試或將來作為通用容器

[英]Return Try or Future As Generic Container

我不想使用object JSONSourceLoaderUtil重載方法,而是要切換到模式匹配樣式。 如何處理結果Try[JValue]Future[JValue]作為F[JValue]

導入和案例類,

import scalaz._
import Scalaz._
import org.json4s.JsonAST.{JObject, JValue}

trait DataSource
case class LocalFile(input: File) extends DataSource
case class RemoteResource(url: String, req: JValue) extends DataSource

我現在所擁有的

object JSONSourceLoaderUtil {

  def jsonFrom[F[_], S <: DataSource](source: S)(f: S => F[JValue])(implicit ev: Monad[F]): F[JValue] = ev.bind(ev.point(source))(f)

  def extractFrom(source: RemoteResource): Future[JValue] = {
    Future( ... ).flatMap(input => Future.fromTry(Parser.parseFromChannel(Channels.newChannel(input))))
}

  def extractFrom(source: LocalFile): Try[JValue] = Parser.parseFromFile(source.input)
}

如何轉換為模式匹配樣式? 如果我自己陷入困境,還有另一種方法嗎? 謝謝。

object JSONSourceLoaderUtil {

def jsonFrom[F[_], S <: DataSource](source: S)(f: S => F[JValue])(implicit ev: Monad[F]): F[JValue] = ev.bind(ev.point(source))(f)

def extractFrom(source: DataSource): F[JValue] = source match {
    case RemoteResource(url, request) => Future( ... )
      .flatMap(input => Future.fromTry(Parser.parseFromChannel(Channels.newChannel(input))))) // cannot convert Future to F

    case LocalFile(input) => Parser.parseFromFile(input)  // cannot convert Try to F
  }
}

所需的F取決於數據源的類型。 那么,為什么不明確一點呢?

trait DataSource[F[_]] {
  def extract: F[JValue]
}

case class LocalFile(input: File) extends DataSource[Try] {
  def extract = Parser.parseFromFile(input)
}

case class RemoteResource(url: String, req: JValue) extends DataSource[Future] {
  def extract = Future( ... )
    .flatMap(input => Future.fromTry(Parser.parseFromChannel(Channels.newChannel(input)))))
}

刪除提取方法並編寫

def extractFrom[F[_]](source: DataSource[F]): F[JValue] = source match {
    case RemoteResource(url, request) => Future( ... )
      .flatMap(input => Future.fromTry(Parser.parseFromChannel(Channels.newChannel(input)))))

    case LocalFile(input) => Parser.parseFromFile(input)
  }
}

至少在Scala 2.12中應該也可以工作。 但是我發現第一個解決方案是更清潔的。

暫無
暫無

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

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