我有一个用Scala编写的简单程序,它将逻辑表达式作为case类的成员进行操作,扩展Expr特性(下面的代码)。然后,我有一些函数,它们简单地对参数的类进行模式匹配,并执行一些操作。
sealed trait Expr
case class Implication(lhs: Expr, rhs: Expr) extends Expr {
override def toString = "(" + lhs.toString + "->" + rhs.toString + ")"
}
case class Negation(body: Expr) extends Expr {
override def toString = "!" + body.toString
}
case class Conj(lhs: Expr, rhs: Expr) extends Expr {
override def toString = "(" + lhs.toString + "&" + rhs.toString + ")"
}
case class Disj(lhs: Expr, rhs: Expr) extends Expr {
override def toString = "(" + lhs.toString + "|" + rhs.toString + ")"
}
case class Variable(name: String) extends Expr {
override def toString = name
}函数示例:
def substitute(map: m.HashMap[String, Expr]): Expr = this match {
case Variable(name) => map.getOrElse(name, this)
case Conj(a, b) => Conj(a.substitute(map), b.substitute(map))
case Disj(a, b) => Disj(a.substitute(map), b.substitute(map))
case Implication(a, b) => Implication(a.substitute(map), b.substitute(map))
case Negation(a) => Negation(a.substitute(map))
}问题是:如何在Clojure中模仿相同的功能?基本上,我想要的是区分函数参数的类和它上的模式匹配,最好是有守卫。
发布于 2014-10-16 04:21:43
这个问题可以使用if、cond、condp或其他条件运算符来解决。要查找类,请使用class或type函数。
使用拉链行走和编辑地图树。http://ravi.pckl.me/short/functional-xml-editing-using-zippers-in-clojure/
地图中有许多标记条目的方法:
看一看enlive寻找灵感- https://github.com/cgrand/enlive
发布于 2014-10-15 23:34:16
看起来,表达式的核心是它是一个带有标记节点的递归数据结构。您可以从Clojure中的红黑树示例构建表达式数据结构。
关键的见解是,表达式树是用嵌套的普通Clojure数据类型表示的。在红黑示例中,每个节点都是一个4元组类型的左-子值右子.在您的示例中,将表达式表示为类型&子表达式可能更有意义。
在这两种情况下,core.match都使用模式匹配来匹配向量和关键字等普通Clojure类型。您可能可以将表达式匹配为1到1。
https://stackoverflow.com/questions/26389153
复制相似问题