转换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"))