转换scalaz中的`Option[Tuple]``\/`

转换scalaz中的`Option[Tuple]``\/`,scala,scalaz,Scala,Scalaz,我正在尝试从选项[Tuple]创建连接,并返回 结果是析取,但我的代码看起来有点奇怪: def ssh(config: GushConfig): \/[Throwable, Client] = { val params = for { host <- config.mysqlHost port <- config.mysqlPort user <- config.mysqlUser password <- con

我正在尝试从
选项[Tuple]
创建连接,并返回 结果是析取,但我的代码看起来有点奇怪:

  def ssh(config: GushConfig): \/[Throwable, Client] = {
    val params = for {
      host <- config.mysqlHost
      port <- config.mysqlPort
      user <- config.mysqlUser
      password <- config.mysqlPassword
      sshAddress <- config.sshTunnelAddress
      sshTunnelUser <- config.sshTunnelUser
    } yield (host, port, user, password, sshAddress, sshTunnelUser)

    params match {
      case Some((host, port, user, password, sshAddress, sshTunnelUser)) ⇒
        Try({
          // Do stuff that can fail and throw exceptions

          new Client("127.0.0.1", lport, user, password)
        }) match {
          case Success(v) ⇒ v.right
          case Failure(t) ⇒ t.left
        }
      case None ⇒
        new Exception("Not enough parameters to initialize a ssh client").left
    }
  }
defsh(配置:GushConfig):\/[Throwable,Client]={
val params=用于{

主机您可能希望将它们转换为同一类型-您可以在
选项上使用
.torightdisconction
,您可以使用
scala.util.control.Exception
执行
Try
操作:

import scala.util.control.Exception._

for {
  params_ ← params.toRightDisjunction(
    new Exception("Not enough parameters to initialize a ssh client"))
  (host, port, user, password, sshAddress, sshTunnelUser) = params_
  v ← catching(classOf[Exception]) either functionThatCouldThrow() disjunction
} yield v
您还可以使用
.sequence
而不是显式的
来执行初始
选项
(这可能需要无形状的scalaz):


scalaz.std包包含

object option extends OptionInstances with OptionFunctions {
  object optionSyntax extends scalaz.syntax.std.ToOptionOps with scalaz.syntax.std.ToOptionIdOps
}
Scalaz添加到scala的操作。Option
OptionInstances
(类型类)中定义,并且
OptionFunctions
包含以下方法:

  final def toRight[A, E](oa: Option[A])(e: => E): E \/ A = oa match {
    case Some(a) => \/-(a)
    case None    => -\/(e)
  }

  final def toLeft[A, B](oa: Option[A])(b: => B): A \/ B = oa match {
    case Some(a) => -\/(a)
    case None    => \/-(b)
  }
语法和隐式转换在
scalaz.syntax
包中提供,尤其是
OptionOps
是scalaz的“富选项”。
ToOptionOps
包含来自
OptionOps=>OptionOps的隐式转换

如果正确导入选项Syntax,则可以编写以下代码

import scalaz.std.option.optionSyntax._
val disjunction = params.\/>(new Exception("Not enough parameters to initialize a ssh client"))
然后你可以从那里映射/平面映射

import scalaz.std.option.optionSyntax._
val disjunction = params.\/>(new Exception("Not enough parameters to initialize a ssh client"))