首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >参数类上的Clojure模式匹配

参数类上的Clojure模式匹配
EN

Stack Overflow用户
提问于 2014-10-15 18:05:01
回答 2查看 426关注 0票数 0

我有一个用Scala编写的简单程序,它将逻辑表达式作为case类的成员进行操作,扩展Expr特性(下面的代码)。然后,我有一些函数,它们简单地对参数的类进行模式匹配,并执行一些操作。

代码语言:javascript
复制
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
}

函数示例:

代码语言:javascript
复制
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中模仿相同的功能?基本上,我想要的是区分函数参数的类和它上的模式匹配,最好是有守卫。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-16 04:21:43

这个问题可以使用ifcondcondp或其他条件运算符来解决。要查找类,请使用classtype函数。

使用拉链行走和编辑地图树。http://ravi.pckl.me/short/functional-xml-editing-using-zippers-in-clojure/

地图中有许多标记条目的方法:

  • {:标记:变量:值42}
  • (未记录变量值)

看一看enlive寻找灵感- https://github.com/cgrand/enlive

票数 0
EN

Stack Overflow用户

发布于 2014-10-15 23:34:16

看起来,表达式的核心是它是一个带有标记节点的递归数据结构。您可以从Clojure中的红黑树示例构建表达式数据结构。

关键的见解是,表达式树是用嵌套的普通Clojure数据类型表示的。在红黑示例中,每个节点都是一个4元组类型的左-子值右子.在您的示例中,将表达式表示为类型&子表达式可能更有意义。

在这两种情况下,core.match都使用模式匹配来匹配向量和关键字等普通Clojure类型。您可能可以将表达式匹配为1到1。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26389153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档