Functional programming 要反汇编数据类型ocaml
如果我必须反汇编一个数据类型作为它的可变大小,我仍然可以使用match和with,如果答案是肯定的,你可以帮助我弄清楚我是如何使用这种语言的初学者,或者我是否可以使用其他方法 定义的类型如下: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 从我看到的示例中,当静
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模式调用相同的表达式。