gpt4 book ai didi

scala - 有没有更优雅的方式来使用 Scalaz 编写这个?

转载 作者:行者123 更新时间:2023-12-04 18:12:35 26 4
gpt4 key购买 nike

下面的代码有效,但选项 b 上的模式匹配看起来并不优雅。
有没有办法在保持相同语义的同时避免它?

object A {
def apply(b: B): ValidationNEL[String, A] = ...
}

case class C(i: Int, a: Option[A])

object C {
def apply(i: Int, b: Option[B]): ValidationNEL[String, C] = b match {
case None => Success(C(i, None))
case Some(sb) => A(sb).map(bb => C(i, Some(bb)))
}
}

最佳答案

使用 scalaz,您可以折叠 Option

b fold ( sb => A(sb) map (bb => C(i, some(bb))), C(i, none).success)

可能有一种方法可以简化 sb => A(sb) map (bb => C(i, some(bb)))使用无点样式,但这在 scala 中通常很难看:

设置
scala> :paste
// Entering paste mode (ctrl-D to finish)

object A {
def apply(b: B): ValidationNEL[String, A] = sys.error("")
}
case class A()
case class B()
case class C(i: Int, a: Option[A])

// Exiting paste mode, now interpreting.

defined module A
defined class A
defined class B
defined class C

第一个实现
scala> def apply(i: Int, b: Option[B]): ValidationNEL[String, C] =
| b fold ( sb => A(sb) map (bb => C(i, some(bb))), C(i, none).success)
apply: (i: Int, b: Option[B])scalaz.Scalaz.ValidationNEL[String,C]

第二个实现

如果你声明一等函数,你就有更好的组合机会。例如:
object A { val fromB: B => ValidationNEL[String, A] = _ => sys.error("") }
object C { val fromA: Int => A => C = i => a => C(i, some(a)) }

defined module A
defined module C

然后
scala> def apply(i: Int, b: Option[B]): ValidationNEL[String, C] =
| b fold (A.fromB andThen (_ map C.fromA(i)), C(i, none).success)
apply: (i: Int, b: Option[B])scalaz.Scalaz.ValidationNEL[String,C]

关于scala - 有没有更优雅的方式来使用 Scalaz 编写这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12311004/

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