ocaml中的类型问题

时间:2010-12-02 15:34:47

标签: ocaml

我已经定义了这种类型:

  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;;

2 个答案:

答案 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代替proveint的调用者可以进行模式匹配。

如果这太麻烦(在多个地方调用state)那么在函数中使用match语句是有意义的,只要错误匹配(prove和'N_')得到正确处理