相关疑难解决方法(0)

其他库的Scalaz类型实例的总结

我经常发现自己想要(然后通常编写)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.9Promise(和Promise[Either[Throwable, _]]等)是对各种事情巨大有用.

一个适用函子实例为标准库的Parser品牌应用性解析更加简洁和优雅.(我只是注意到Scalaz 7 现在提供了一个monad实例Parser.)

等等...

这些实例几乎总是非常通用的,我相信很多人已经写了很多次.我正在捕获的这个问题是Scalaz类型类实例的某种聚合器或交换所.我不确定这样的事情是否存在 - 我当然无法找到类似的东西 - 但即使只是一组链接到博客文章,GitHub存储库或其他资源对我也很有用.

我更喜欢Scalaz 7实例,但我会采取任何我能得到的.

java monads scala typeclass scalaz

13
推荐指数
1
解决办法
412
查看次数

将组合子解析器的列表/序列转换为单个

我有一个值列表,我可以从中构建一个解析器列表,它通过映射依赖于这些值(参见示例).那么我想要做的是通过连接将解析器列表转换为单个解析器.

一种可能性是使用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)).

scala parser-combinators

7
推荐指数
1
解决办法
915
查看次数

将Monad包装到解析器中 - 我是否需要Monad变换器以及如何操作?

我有一个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的奇怪的导入系统.有人可以回答是否

  1. 我可以使用monad变换器和
  2. 这原则上看起来如何,使用Scalaz 7作为包装我自己的ExpMonad 的Scala组合器解析器.

scala monad-transformers scalaz

4
推荐指数
1
解决办法
631
查看次数