小编Ale*_*ise的帖子

嵌套类的反射

我看到大多数一直在玩ScalaSigParser的人,为了以一种很好的方式服务于惯用的Scala案例类,已经避免了这个问题,但我想知道它是否可行.我的情况很像以下情况:

trait OuterTrait {
  abstract class InnerAbstract(i: Int)
}

object OuterObject extends OuterTrait {
  case class InnerConcrete(i: Int) extends InnerAbstract(i)
}

val bippy = OuterObject.InnerConcrete(123)

val s = serialize(bippy)

// time passes...

val obj = deserialize[OuterObject.InnerConcrete](s)
Run Code Online (Sandbox Code Playgroud)

所以,我可以找到ScalaSig for OuterTrait,但我还没有找到一个很好的通用方法来识别InnerConcrete类中的外部对象.任何原型?

reflection scala nested-class

11
推荐指数
1
解决办法
544
查看次数

复杂的布尔表达式优化,范式?

我正在开发一个流规则引擎,我的一些客户有几百条规则,他们想对到达系统的每个事件进行评估。规则是纯(即无副作用)布尔表达式,它们可以任意深度嵌套。

客户在运行时创建、更新和删除规则,我需要动态检测和适应规则的数量。目前,表达式计算在内部 AST 上使用解释器,我还没有开始考虑 codegen。

与往常一样,树中的某些谓词的计算成本比其他谓词要便宜得多,而且我一直在寻找一种算法或数据结构,以便更容易找到便宜的谓词,并且可以有效地解释为控制整个表达。我对这种模式的心理标题是“ANDs all way to the root”,即所有祖先都是ANDs的任何谓词都可以解释为控制。

尽管进行了几天的文献搜索,阅读了有关 ROBDD、CNF、DNF 等的信息,但我还是无法从行业中的常见做法到我的特定用例关闭循环。我发现似乎相关的一件事是布尔表达式索引的分析和优化, 但不清楚如何在不自己实现 BE-Tree 数据结构的情况下应用它,因为似乎没有开源实现。

我一直半开玩笑地向我的团队提到,这些天我们将需要一个 SAT 求解器。我想编写一个遍历树并跟踪每个祖先是 AND 还是 OR 的递归算法可能就足够了,但我一直有“这肯定是一个已解决的问题”的感觉。:)

编辑:与几个朋友交谈后,我想我可能有一个解决方案的草图!

  1. 将表达式转换为联合范式,根据定义,其中每个节点都处于有效的短路位置
  2. 使用 Tseitin 算法尽量避免 CNF 变换导致的表达式大小的指数膨胀
  3. 对于树中的每个AND,按成本升序排序(即最便宜的到左边)
  4. ???
  5. 利润!^Weval 像往常一样:)

optimization expression boolean-expression sat

8
推荐指数
1
解决办法
180
查看次数

在什么条件推断下什么都不可取?

在我自己的代码和许多邮件列表发布中,我注意到混乱,因为没有任何东西被推断为两个其他类型的最小上限.

答案可能对你来说很明显*,但我很懒,所以我问你*:

  • 在什么条件下推断这样的结果是最理想的结果?

  • 让编译器在这些情况下抛出错误或警告除非被某种注释覆盖是否有意义?

*多个

scala type-inference nothing

6
推荐指数
1
解决办法
222
查看次数

使用Scalas动态类型的动态代理

是否可以使用Scalas新的动态类型功能创建类似拦截器的AOP?例如:是否可以创建一个通用的秒表拦截器,它可以与任意类型混合以分析我的代码?或者我还需要使用AspectJ吗?

scala scala-2.9

6
推荐指数
1
解决办法
584
查看次数

懒散,广度优先遍历玫瑰树?

我正在尝试重构一个当前产生Seq[X]使用相当昂贵的递归算法的组件,以便它产生一个Stream[X]代替,因此X可以按需加载/计算,并且生产者不必事先猜测如何为了满足消费者需要做很多事情.

从我所读到的,这是一个"展开"的理想用途,所以这是我一直试图采取的路线.

这是我的unfold功能,源于David Pollak的例子,该例子已由某位莫里斯先生审查过:

def unfold[T,R](init: T)(f: T => Option[(R,T)]): Stream[R] = f(init) match {
  case None => Stream[R]()
  case Some((r,v)) => r #:: unfold(v)(f)
}
Run Code Online (Sandbox Code Playgroud)

这是一棵小树,试试我的运气:

case class Node[A](data: A, children: List[Node[A]]) {
  override def toString = "Node(" + data + ", children=(" + 
                                children.map(_.data).mkString(",") + 
                                "))"
}

val tree = Node("root", List(
  Node("/a", List(
    Node("/a/1", Nil),
    Node("/a/2", Nil)
  )),
  Node("/b", List(
    Node("/b/1", List(
      Node("/b/1/x", Nil),
      Node("/b/1/y", …
Run Code Online (Sandbox Code Playgroud)

scala breadth-first-search

6
推荐指数
1
解决办法
2122
查看次数