gpt4 book ai didi

scala - 在 scalaz `Option[Tuple]` 中转换 `\/`

转载 作者:行者123 更新时间:2023-12-04 23:00:19 25 4
gpt4 key购买 nike

我正在尝试从 Option[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
}
}

我首先需要模式匹配我的第一个 Option检查我是否有
所有必需的选项,然后如果我这样做,请尝试在 Try 内连接
然后将 try 的结果转换为析取。

有没有更好的方法来进行这种转换?

最佳答案

您可能希望将它们都转换为相同的类型 - 您可以使用 .toRightDisjunctionOption ,你可以做 Try使用的东西 scala.util.control.Exception反而:

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

你也可以做初始 Option使用的东西 .sequence而不是明确的 for/ yield (这可能需要 shapeless-scalaz):
params = (config.mysqlHost, config.mysqlPort, ...).sequence

关于scala - 在 scalaz `Option[Tuple]` 中转换 `\/`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27443603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com