【问题标题】:to disassemble a data type ocaml反汇编数据类型 ocaml
【发布时间】:2010-11-27 16:17:20
【问题描述】:

如果我必须将数据类型分解为可变大小,我是否仍然可以使用“match and with”,如果答案是肯定的,您可以帮我弄清楚如何(我是这种语言的初学者) ,还是我还是用其他方法。

定义的类型是这样的:

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

从我看到的示例中,当我使用静态类型的结构时使用“匹配和与”,就我而言?

【问题讨论】:

  • 我无法理解这个问题,完全无法解析最后一句话。你能改写一下吗?你能否澄清一下“拆卸”的意思?
  • 我有一个例子:让公式=和[变量“q0”;或[变量“q1”;变量“q2”];变量 "q3"] ,我需要逐个元素解析
  • 模式匹配如果确实是正确的解决方案,但由于数据类型是递归的,因此处理它的函数也需要递归。
  • 拆解数据结构的意思
  • 怎么办,不幸的是我现在开始使用ocaml所以我有点困难,我尝试了“match and with”一个更简单的结构,我做到了,但是因为我需要这种结构不知道怎么帮我?

标签: functional-programming pattern-matching ocaml


【解决方案1】:

下面是一个使用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 *)

【讨论】:

  • 对于“和”的情况,没有动作
  • @Antonio:如果你有一个模式,-> 后面没有,它会“落入”下一个案例(假设两个模式绑定相同的变量)。换句话说,AndOr 模式调用相同的表达式。
【解决方案2】:

如果你想操纵类型,你可以使用模式匹配(除其他外,我觉得这是最优雅的)。它本质上是 Match with 的语法糖。

例如:

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*)

【讨论】:

    【解决方案3】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2010-12-02
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多