我有两个相同类型的实例化案例类.
case class Foo(x : Option[String], y : Option[String], z : Option[String])
Run Code Online (Sandbox Code Playgroud)
让我们调用实例化的类A和B.
val a = Foo(x=Some("foo"), y=Some("bar"), z=Some("baz"))
val b = Foo(x=None, y=Some("etch"), z=None)
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以通过一般操作在单个操作中用B更新案例类A.
val c = b *oper* a // produces Foo(x=Some("foo"), y=Some("etch"), z=Some("baz"))
Run Code Online (Sandbox Code Playgroud)
参数设置为无忽略.理想情况下,操作也应该是通用的,因此它可以作用于任何类型的案例类.
我有一些直觉,可以通过先将类转换为元组/列表并在操作完成后转换回类来使用Scalaz来实现这一点 - 也许使用ApplicativeBuilder?我是否以正确的方式思考这个问题?有任何想法吗?
在最近的Stack Overflow问题中,作者想要将某种类型的解析器列表更改为返回该类型列表的解析器.我们可以想象使用Scalaz sequencefor applicative functors做到这一点:
import scala.util.parsing.combinator._
import scalaz._
import Scalaz._
object parser extends RegexParsers {
val parsers = List(1, 2, 3).map(repN(_, """\d+""".r))
def apply(s: String) = parseAll(parsers.sequence, s)
}
Run Code Online (Sandbox Code Playgroud)
这里我们列出三个返回整数列表的解析器,并将其转换为一个返回整数列表列表的解析器.不幸的是,Scalaz没有提供Applicative实例Parser,所以这段代码不能编译,但这很容易解决:
import scala.util.parsing.combinator._
import scalaz._
import Scalaz._
object parser extends RegexParsers {
val parsers = List(1, 2, 3).map(repN(_, """\d+""".r))
def apply(s: String) = parseAll(parsers.sequence, s)
implicit def ParserPure: Pure[Parser] = new Pure[Parser] {
def pure[A](a: => A) = success(a)
}
implicit def ParserFunctor: …Run Code Online (Sandbox Code Playgroud)