2016-09-12 6 views
0

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 
    } 
} 

答えて

0

希望する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) 
    } 
} 

を書いても、おそらくat least in Scala 2.12、動作するはずです。しかし、私は最初の解決策を見つけるクリーナーです。

+0

私は2番目の解決策を見つけましたが、コンパイルできませんでした。私はそれがコンパイラのバグであることをどのように知っていたでしょうか?どうもありがとう。私はフォローアップqを持っています。第1の解決策 "OO"は(私は間違った言葉を使うことができる)だろうか?たとえば、私はこのソリューションをhaskellに変換できません。 – thlim

+1

さて、ScalaはHaskellではありません。特に、この特定のパターン(GADT)のサポートは限られています。 –

関連する問題