Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 参数类上的Clojure模式匹配_Scala_Clojure_Pattern Matching - Fatal编程技术网

Scala 参数类上的Clojure模式匹配

Scala 参数类上的Clojure模式匹配,scala,clojure,pattern-matching,Scala,Clojure,Pattern Matching,我有一个用Scala编写的简单程序,它将逻辑表达式作为case类的成员进行操作,case类扩展了下面的Expr trait代码。然后我有一些函数,它们简单地对参数类进行模式匹配,并执行一些操作 sealed trait Expr case class Implication(lhs: Expr, rhs: Expr) extends Expr { override def toString = "(" + lhs.toString + "->" + rhs.toString + "

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

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中模仿相同的功能?基本上,我只想区分函数参数的类和其上的模式匹配,最好是使用卫士。

表达式的核心似乎是它是一个带有标记节点的递归数据结构。您可以从Clojure中的一个示例构建表达式数据结构

关键的细节是表达式树是用嵌套的普通Clojure数据类型表示的。在红黑示例中,每个节点都是一个4元组[type left child value right child]。在您的示例中,将表达式表示为[type&children]可能更有意义


在这两种情况下,都会对向量和关键字等普通Clojure类型使用模式匹配。您可能可以将表达式匹配1对1进行移植。

可以使用if、cond、condp或其他条件运算符解决此问题。要查找类,请使用类或类型函数

使用拉链行走和编辑地图树。

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

{:标记:变量:值42} defrecord变量[值]
看一看enlive获取灵感-

你必须记住的一件事是,语言并非总是可以1:1映射,在scala中完成的事情可能无法在clojure中完成,因为clojure处理事情的方式。。。例如,在clojure中,函数是最小的代码块,而不是对象,您很少需要创建类,在scala中,类控制一切我确实理解这一点,但我想再次了解clojure处理这种情况的方法。通过Haskell的ADT和模式匹配,我可以很容易地做到这一点,但我对Clojure的了解目前还太有限。好吧,case类只是scala实现代数数据类型的方式,Clojure实现这一点的方式是使用maps或vectorsstart进行问题描述。如果要测试类型/类,请使用类型XM,m的重要性是什么。在参数列表映射中:m.HashMap[String,Expr]?