проблема с типом в ocaml - PullRequest
       4

проблема с типом в ocaml

2 голосов
/ 02 декабря 2010

Я определил этот тип:

  type state= L of state_simple * int | N of state * int |  State of int 

, если мне нужно только целое число "State" Что мне делать?

вот код:

   let prove state ch a =

  (*"state" is of type State st, i need the integer st*)
   let (_,p,suc,_) =game.(i) in

   let x = ref[] in
   let y = ref(Variable a.(suc.(0)) )in
   let l = Array.length suc in 

   x :=a.(suc.(0)) :: !x;

   if (p=0) then 
      (if (l <> 1) then
           (for i=1 to l-1 do 
               x := ((a.(suc.(i))) :: !x)
           done;

  !x;;

Ответы [ 2 ]

3 голосов
/ 02 декабря 2010

Сначала я бы порекомендовал попытаться лучше понять неизменяемость и функциональные методы, так как вам не нужны ссылки для большей части того, что вы делаете.Вот как я мог бы получить целое число:

let prove st ch a =

  let i = match st with
   | State x -> x
   | L _ | N _ -> assert false (* or raise an exception *)
  in
   let (_,p,suc,_) =game.(i) in

   let x = ref[] in
   let y = ref(Variable a.(suc.(0)) )in (* are you using y anywhere? *)
   let l = Array.length suc in 

   x :=a.(suc.(0)) :: !x;

   if (p=0) then 
      (if (l <> 1) then
           (for i=1 to l-1 do 
               x := ((a.(suc.(i))) :: !x)
           done;

  !x;;

Вы, кажется, не используете y, я не уверен, что это из-за опечатки или чего-то еще.Также вы можете создать свой список x функционально, используя рекурсию:

let prove st ch a =

  let i = match st with
   | State x -> x
   | L _ -> assert false (* or raise an exception *)
   | N _ -> assert false
  in
   let (_,p,suc,_) =game.(i) in

   let l = Array.length suc in 

   let rec loop x lst =
     if x >= l then
       lst
     else
       loop (x+1) (a.(suc.(i)) :: lst)
   in
   if (p=0) && (l <> 1) then 
     loop 1 [a.(suc.(0))]
   else
     []

РЕДАКТИРОВАТЬ: После прочтения некоторых комментариев, вы не понимаете, что представляет собой тип в OCaml.

type state= L of state_simple * int | N of state * int |  State of int

создает новый тип с именем state.State(2) и N(State(3), 2) имеют одинаковый тип, но разные значения. Если я напишу функцию с сигнатурой val f : state -> int (то есть функцию с именем f, которая принимает state ивозвращает int), я могу передать эту функцию State(2) или N(N(State(3), 4), 2) или что-нибудь еще.

Поскольку вы хотите, чтобы функция prove принимала только stateзначение которого State(x), вы можете переосмыслить способ, которым вы звоните prove.Возможно, prove должен просто взять int вместо state, и вызывающий prove может выполнить сопоставление с образцом.

Если это слишком громоздко (prove вызывается в несколькихмест), тогда наличие оператора match в функции имеет смысл, если неправильные совпадения (L_ и 'N_') обрабатываются правильно.

3 голосов
/ 02 декабря 2010

Если я правильно вас понял, что-то вроде:

match foo with
| State i -> do_something_with_integer i
| _ -> ()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...