1

2つの参照呼び出しの内容を交換する関数を書いています。

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
4

1 に答える 1

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

于 2013-02-19T14:37:29.603 に答える