Сначала я бы порекомендовал попытаться лучше понять неизменяемость и функциональные методы, так как вам не нужны ссылки для большей части того, что вы делаете.Вот как я мог бы получить целое число:
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_') обрабатываются правильно.