我经常发现自己想要(然后通常编写)Scalaz类型的类实例用于其他Scala或Java库中的类.举几个例子:
Shapeless的一个monoid实例为HList你提供了monoid实例,用于几乎免费提供适当类型成员的case类.
对于适用函子例如电梯的Box允许您例如测序箱列表:
scala> val boxen: List[Box[Int]] = Full(1) :: Full(2) :: Full(3) :: Nil
boxen: List[net.liftweb.common.Box[Int]] = List(Full(1), Full(2), Full(3))
scala> boxen.sequence
res0: net.liftweb.common.Box[List[Int]] = Full(List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
对于单子例如派遣0.9的Promise(和Promise[Either[Throwable, _]]等)是对各种事情巨大有用.
一个适用函子实例为标准库的Parser品牌应用性解析更加简洁和优雅.(我只是注意到Scalaz 7 现在提供了一个monad实例Parser.)
等等...
这些实例几乎总是非常通用的,我相信很多人已经写了很多次.我正在捕获的这个问题是Scalaz类型类实例的某种聚合器或交换所.我不确定这样的事情是否存在 - 我当然无法找到类似的东西 - 但即使只是一组链接到博客文章,GitHub存储库或其他资源对我也很有用.
我更喜欢Scalaz 7实例,但我会采取任何我能得到的.
我有一个值列表,我可以从中构建一个解析器列表,它通过映射依赖于这些值(参见示例).那么我想要做的是通过连接将解析器列表转换为单个解析器.
一种可能性是使用foldLeft和~:
parsers.foldLeft(success(Nil)){case (ps,p) => rs ~ p ^^ {case xs ~ x => x ::xs}} ^^ (_.reverse)
Run Code Online (Sandbox Code Playgroud)
我不知道组合器解析器是如何工作的; 会有一个深度为列表长度的调用堆栈吗?因此,我可能会遇到SO错误很长时间的连接?
有不同的方式更具可读性吗?
假设您有一个包含两行的文件.第一行包含n个整数x_1到x_n.第二行包含根据第一行属于组的x_1 + x_2 + ... x_n整数.我想从第一行获取整数序列并创建n个解析器p_1到p_n,其中p_i解析x_i整数.
假设我有l = List(1,2,3)第一行的整数列表.对于每个整数,n我创建一个解析n整数的解析器:parsers = l.map(repN(_,integer)).
我有一个monadic类型Exp,我想构建一个解析为这样的值的解析器.以下代码有效,但是我能做些更好/更酷的事情吗?
def grid(x: Int, y: Int): Problem = ???
def expInt: Parser[Exp[Int]] = ???
def grid: Parser[Exp[Problem]] =
for{
ex ~ _ ~ ey <- "grid(" ~> expInt ~ "," ~ expInt <~ ")"
} yield for{
x <- ex
y <- ey
} yield grid(x,y)
Run Code Online (Sandbox Code Playgroud)
我听说过monad变形金刚,但仍然有点害怕Scalaz 7的奇怪的导入系统.有人可以回答是否
ExpMonad 的Scala组合器解析器.