2013-02-19 132 views
1

我在写一个交换两个引用调用内容的函数。OCaml中的可变类型

let swap (x : a ref) (y :'a ref) : unit = 

其中

type 'a ref = {mutable contents : 'a} 

我不知道该采取以解决这个什么办法。我使用模式匹配吗?

这是我的测试案例

let test() : bool = 
let r1 = { contents = 5 } in 
let r2 = { contents = 6 } in 
let _ = swap r1 r2 in 
((6,5) = (r1.contents,r2.contents)) 
;; run_test "Swap different" test 
+2

你可以写'ref 5'来代替'{contents = 5}'。 – sepp2k 2013-02-19 14:59:39

回答

3

工作的呢?

let swap x y = 
    let z = !x in 
    x := !y; 
    y := z 

注意:=!只是正常的功能,像这样:

let (:=) r x = r.contents <- x 
let (!) {contents} = contents 

如果你想使用自己的类型定义,那么你可以这样做:

let swap' x y = 
    let z = x.contents in 
    x.contents <- y.contents; 
    y.contents <- z 

最后,如果你正在使用电池,那么你可以使用BatRef.swap这里定义:http://ocaml-batteries-team.github.com/batteries-included/hdoc2/BatRef.html

+0

我仍然收到语法错误。这是因为输出不是单位类型? – user1993381 2013-02-19 14:46:29

+0

你究竟在哪里得到这些语法错误?我已经评估了我的顶级代码中的所有代码。 – rgrinberg 2013-02-19 14:48:15

+0

我刚刚编辑我的帖子,向您展示我的测试用例。出于某种原因,我一直在错误的旁边;;; run_test表示“意外的令牌;;” – user1993381 2013-02-19 14:51:17