我已经定义了这种类型:
type state= L of state_simple * int | N of state * int | State of int
如果我只需要“状态”的整数,我该怎么办?
这是代码:
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;;
答案 0 :(得分:3)
如果我理解你的话,就像:
match foo with
| State i -> do_something_with_integer i
| _ -> ()
答案 1 :(得分:3)
我首先建议尝试更好地理解不变性和功能性技术,因为您不需要参考很多正在做的事情。以下是我将获得整数的方法:
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
的函数(即名为{{1的函数)如果需要f
并返回state
),我可以传递该函数int
或 State(2)
或其他任何内容。
由于您希望函数N(N(State(3), 4), 2)
仅接受值为prove
的{{1}},因此您可能需要重新考虑调用state
的方式。也许State(x)
应该只使用prove
代替prove
,int
的调用者可以进行模式匹配。
如果这太麻烦(在多个地方调用state
)那么在函数中使用match语句是有意义的,只要错误匹配(prove
和'N_')得到正确处理