【问题标题】:Imperative pointer type data structures in OCAMLOCAML 中的命令式指针类型数据结构
【发布时间】:2019-12-01 14:16:10
【问题描述】:

我有一种双向指针列表。我要做的是编写一个给定列表的过程,它应该返回一个仅包含奇数索引上的元素的列表。我是 OCaml 的新手,它的指针类型数据结构,这是我到目前为止所写的,但它不起作用。

错误:此表达式的类型为 'a elem 选项 但是需要一个类型为“b elem”的表达式

type 'a elem = 
  {
    v : 'a;
    mutable next: 'a lista;
    mutable prev: 'a lista;
  }
and 'a lista = 'a elem option

exception NOT_FOUND

let x = ref None;;

let value e =
  match e with
  | Some x -> x.v
  | None -> raise NOT_FOUND;;

let generuj n x = 
  x := Some {v = 0; next = None; prev = None};
  for i = 1 to n do
    match !x with
    | None -> assert false
    | Some y ->
        let z = ref { v = i; next = None; prev = None } in
        y.next <- Some !z;
        !z.prev <- Some y;
        x := Some !z
  done

let second l x =
  let i = ref 0 in
  while !l <> None do
    let z = ref !x in
    if (!i mod 2 = 0) then
      x := {v = value !l; next = None; prev = Some !z}
    else ();
    let y = !l.next in
    l := {v = value y; next = y.next; prev = None};
    i := !i + 1
  done;;

谁能帮我理解为什么它不起作用?

【问题讨论】:

  • 在您发布的代码中... value 代表什么?
  • 对不起,忘记补充我已经编辑了代码
  • 你能不能再贴一个函数签名?
  • 你没有找到。那是对的吗?应该是 Not_found 吗?
  • 我已经发布了完整的代码和签名。 “Generuj”并不重要

标签: pointers ocaml


【解决方案1】:

从表达式value !l 可以得出结论l 属于'a elem option ref 类型。但是在表达式 !l.next 中,您没有将 l 作为选项类型处理。你需要测试!lNone还是Some ('a elem)

请注意,您确实在函数开头将lNone 进行比较。

还要注意下一行有相同的类型错误。您需要将l 设置为Some ...

【讨论】:

    猜你喜欢
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-13
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    相关资源
    最近更新 更多