【问题标题】:Mutable Types in OCamlOCaml 中的可变类型
【发布时间】:2013-02-19 22:50:40
【问题描述】:

我正在编写一个交换两个引用调用内容的函数。

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

【问题讨论】:

  • 你可以写ref 5而不是{ contents = 5 }

标签: ocaml


【解决方案1】:

这行得通吗?

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

【讨论】:

  • 我仍然遇到语法错误。这是因为输出不是单元类型吗?
  • 您究竟是从哪里得到这些语法错误的?我已经很好地评估了顶层中的所有代码。
  • 我刚刚编辑了我的帖子以向您展示我的测试用例。出于某种原因,我不断在 ;; 旁边收到错误消息。的 run_test 说“意外的令牌;;”
  • 您添加的代码非常适合我。为了清楚起见,我稍微编辑了缩进,并将_ 替换为()。不确定这是否是错误。不过它确实有效。废话,它说我的编辑需要经过同行评审。不知道什么时候能看到……
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-23
  • 2013-03-19
  • 1970-01-01
相关资源
最近更新 更多