Functional programming 要反汇编数据类型ocaml

Functional programming 要反汇编数据类型ocaml,functional-programming,pattern-matching,ocaml,Functional Programming,Pattern Matching,Ocaml,如果我必须反汇编一个数据类型作为它的可变大小,我仍然可以使用match和with,如果答案是肯定的,你可以帮助我弄清楚我是如何使用这种语言的初学者,或者我是否可以使用其他方法 定义的类型如下: type 'state formula = | And of 'state formula list | Or of 'state formula list | Literal of bool | Variable of 'state 从我看到的示例中,当静

如果我必须反汇编一个数据类型作为它的可变大小,我仍然可以使用match和with,如果答案是肯定的,你可以帮助我弄清楚我是如何使用这种语言的初学者,或者我是否可以使用其他方法

定义的类型如下:

type 'state formula = 
  | And      of 'state formula list
  | Or       of 'state formula list
  | Literal  of bool
  | Variable of 'state  

从我看到的示例中,当静态类型的结构是时,使用了match和with,在我的例子中,我也是这样做的?

如果你想操纵类型,你可以在其他事情上使用patter matching,但我觉得这是最优雅的。它本质上是用来搭配的语法糖

例如:

let identify_formula=function
And(l) -> 0
|Or(l) -> 1
|Literal(b) -> 2
| Variable(v) -> 3;;
有关如何操作类型的一个不那么简单的示例:

type  l=Cons of int*l
    | Nil;;

let rec sum_l=function
Cons(hd,tl)->hd+ sum_l(tl)
| Nil-> 0;;

sum_l(Cons(1,Cons(2,Cons(3,Nil))));; (*r6*)

下面是一个使用match处理公式类型的示例:

type 'state formula = | And of 'state formula list | Or of 'state formula list | Literal of bool | Variable of 'state

let rec count_vars form = match form with
| And forms 
| Or forms -> List.fold_left (+) 0 (List.map count_vars forms)
| Literal _ -> 0
| Variable _ -> 1

let formula = And [ Variable "q0"; Or[ Variable "q1";Variable "q2"]; Variable "q3"]

let vars_in_formula = count_vars formula (* 4 *)

也许您需要一个代码示例来适应您的需要

type 'state formula =
  | Literal of bool
  | And of 'state formula list
  | Or of 'state formula list
  | Variable of 'state

let rec eval variable_env formula =
  match formula with
    | Literal b -> b
    | Variable v -> variable_env v
    | And formulas -> List.for_all (eval variable_env) formulas
    | Or formulas -> List.exists (eval variable_env) formulas

(* same as eval, different code *)
let rec eval2 env = function
  | Literal b -> b
  | Variable v -> env v
  | And [] -> true
  | And (hd::tl) -> eval env hd && eval2 env (And tl)
  | Or [] -> false
  | Or (hd::tl) -> eval env hd || eval2 env (Or tl)

我理解问题有困难,完全无法解析最后一句话。请你重新措辞好吗?您还可以澄清一下反汇编是什么意思吗?我有一个例子:let formula=和[Variable q0;或[Variable q1;Variable q2];Variable q3],如果确实是正确的解决方案,我需要逐个元素地解析模式匹配,但由于数据类型是递归的,函数处理也需要递归。diassemble的意思是分解数据结构我能做什么,不幸的是,我现在开始使用ocaml,所以我有点困难,我尝试了匹配,并使用了一个更简单的结构,我做到了,但既然我需要这种结构,不知道你能帮我什么忙?对于这种情况并没有action@Antonio:如果您有一个模式,后面不跟->,则假定两个模式绑定相同的变量,则将进入下一种情况。换句话说,对And和Or模式调用相同的表达式。