2010-11-27 1 views
2

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

тип определяется так:

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

из примеров, которые я видел «матч и с» используется, когда структура статического типа, в моем случае, как и я?

+2

У меня проблема с пониманием вопроса, и я полностью не могу разобрать последнее предложение. Не могли бы вы перефразировать? Также вы могли бы пояснить, что вы подразумеваете под «разобрать»? – sepp2k 2010-11-27 16:23:25

+0

пример у меня: let formula = И [Variable "q0"; Или [переменная «q1»; переменная «q2»]; Переменная «q3»], мне нужно проанализировать элемент по элементу – kafka 2010-11-27 16:29:58

ответ

5

Так вот пример, который использует 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

Если вы хотите управлять типом, вы можете использовать p (среди прочего, но я считаю это самым элегантным). Это, по сути, синтаксический сахар для 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*) 
0

Возможно, вам нужен пример кода для адаптации к вашим потребностям.

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) 

 Смежные вопросы

  • Нет связанных вопросов^_^