我正在尝试在关联列表中移动一列,并且具有在我检查时似乎有效的代码。
一切似乎都正确无误,但是在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
错误:此表达式具有('a * int *'b)列表类型 但是期望使用单位类型的表达式
我不确定将new_list的类型放在哪里。可能与我的get_src函数有关吗?
答案 0 :(得分:0)
您的if (src > dst)
只有then
部分,而没有else
部分。 OCaml允许这样做,但是它为else部分提供了值()
。换句话说,它要求then
部分具有类型unit
。这就是导致类型错误的原因。
您需要确定在src = dst
时返回什么,然后为else
编写if (src > dst)
部分。