如何解决:在关联列表中移动列时键入错误

时间:2019-02-12 05:31:42

标签: if-statement ocaml typeerror

我正在尝试在关联列表中移动一列,并且具有在我检查时似乎有效的代码。

一切似乎都正确无误,但是在utop中运行时,出现如下所述的类型错误

let rec get_src src alist = match alist with
  |[]-> failwith "no source"
  |(r,c,d)::t -> if c = src then (r,c,d) else get_src src t

let move_column (src:int) (dst:int) alist =
  let src_elt = get_src src alist in
  let rec move_helper src dst alist new_list = match alist with
    |[] -> new_list
    |(r,c,data)::tail ->
       if (dst < 1 || src < 1) then failwith ("index out of range")
       else if (src < dst) then
         (if ((c < src) || (c > dst)) then move_helper src dst tail ((r,c,data)::new_list)
          else if (c = src) then move_helper src dst tail new_list
          else if (c = dst) then move_helper src dst tail ((r,c-1,data)::src_elt::new_list)
          else move_helper src dst tail ((r,c-1,data)::new_list))
       else if (src > dst) then
         (if (c < dst) || (c > src) then move_helper src dst tail ((r,c,data)::new_list)
          else if (c = dst) then move_helper src dst tail (src_elt::new_list)
          else move_helper src dst tail ((r,c+1,data)::new_list))
  in move_helper src dst alist [];;

如果(c src),然后 move_helper src dst tail((r,c,data):: new_list)

错误:此表达式具有('a * int *'b)列表类型        但是期望使用单位类型的表达式

我不确定将new_list的类型放在哪里。可能与我的get_src函数有关吗?

1 个答案:

答案 0 :(得分:0)

您的if (src > dst)只有then部分,而没有else部分。 OCaml允许这样做,但是它为else部分提供了值()。换句话说,它要求then部分具有类型unit。这就是导致类型错误的原因。

您需要确定在src = dst时返回什么,然后为else编写if (src > dst)部分。