разобрать тип данных ocaml - PullRequest
       38

разобрать тип данных ocaml

2 голосов
/ 27 ноября 2010

В случае, если мне нужно разобрать тип данных как переменный размер, могу ли я по-прежнему использовать «сопоставить и с», и если ответ «да», вы можете помочь мне понять, как (я новичок в этом языке)или я или использую другие методы.

тип определяется следующим образом:

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

из примеров, которые я видел, "match and with" используется, когда структурастатический тип был, в моем случае как я?

Ответы [ 3 ]

5 голосов
/ 27 ноября 2010

Итак, вот пример, который использует 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 *)
0 голосов
/ 27 ноября 2010

Может быть, вы хотите, чтобы пример кода адаптировался к вашим потребностям.

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)
0 голосов
/ 27 ноября 2010

Если вы хотите манипулировать типом, вы можете использовать сопоставление с шаблоном (среди прочего, но я считаю это наиболее элегантным). Это по сути синтаксический сахар для Match с.

Например:

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