相关疑难解决方法(0)

更新Scala案例类的操作

我有两个相同类型的实例化案例类.

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?我是否以正确的方式思考这个问题?有任何想法吗?

scala scalaz

12
推荐指数
2
解决办法
2135
查看次数

在Scala中为嵌套类编写类型类实例

最近的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)

scala typeclass scalaz

9
推荐指数
1
解决办法
503
查看次数

标签 统计

scala ×2

scalaz ×2

typeclass ×1