ocaml 类型的问题

Posted

技术标签:

【中文标题】ocaml 类型的问题【英文标题】:problem with type in ocaml 【发布时间】:2010-12-02 15:34:46 【问题描述】:

我已经定义了这种类型:

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

【问题讨论】:

【参考方案1】:

我首先建议您尝试更好地理解不变性和函数式技术,因为您所做的很多事情都不需要参考。以下是我如何获得整数:

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
     []

编辑:在阅读了一些 cmets 之后,听起来您对 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 -&gt; int 的函数(即一个名为 f 的函数,它接受 state并返回一个int),我可以传递该函数State(2) N(N(State(3), 4), 2) 或其他任何东西。

由于您希望函数prove 只接受值为State(x)state,您可能需要重新考虑调用prove 的方式。也许prove 应该只使用int 而不是stateprove 的调用者可以进行模式匹配。

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

【讨论】:

【参考方案2】:

如果我对你的理解正确,类似:

match foo with
| State i -> do_something_with_integer i
| _ -> ()

【讨论】:

这是什么意思:| _ -> () 表示在其他情况下不应该做什么? "_" 表示通配符,或“任何值”; “()”是单位,或者是空函数;整个表达式可以翻译为“对任何其他匹配都不做任何事情” 在状态 i 不匹配的情况下返回 ()。这意味着无论你在 do_something_with_integer 中做什么,我都必须返回 ()。 @Antonio:正如@stonemetal 所说,两个匹配项的返回类型应该相同 @Antonio:我有一种感觉,您将记录与变体类型混合在一起(请纠正我,如果我错了)。首先你为什么要创建 state 类型,它的目的是什么?

以上是关于ocaml 类型的问题的主要内容,如果未能解决你的问题,请参考以下文章

OCaml 表达式类型问题

OCaml 用户定义类型和函数返回错误

Ocaml:在参数类型中使用记录和变体

Ocaml 类型不匹配?预期单位,但为已定义类型

OCaml 特定的 Hashtbl 类型

Ocaml 类型中的 Int 的 Int