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 -> int
的函数(即一个名为 f
的函数,它接受 state
并返回一个int
),我可以传递该函数State(2)
或 N(N(State(3), 4), 2)
或其他任何东西。
由于您希望函数prove
只接受值为State(x)
的state
,您可能需要重新考虑调用prove
的方式。也许prove
应该只使用int
而不是state
,prove
的调用者可以进行模式匹配。
如果这太麻烦(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 类型的问题的主要内容,如果未能解决你的问题,请参考以下文章