Ocaml模式匹配没有像我期望的那样

时间:2014-11-12 14:58:29

标签: list pattern-matching ocaml

我的OCaml计划遇到了一些麻烦:

let moveRight ls i =  
  match getn ls (i+1) with
  |O -> replacex (replacex ls i O) (i+1) R
  |_ -> replacex (replacex ls i O) (i+2) R;

Replacex工作,并将列表ls中的第i个元素替换为x。

但我上面的程序没有。 应该做以下事情: 如果列表为[R; L; O]且i = 1,则应将其更改为[O;L;R],但不会。它似乎在新列表中创建原始列表并执行此操作:[R; R; O; O; L; O]

帮助将不胜感激,我不知道我哪里出错了! 感谢

编辑: replacex如下:

let replacex ls i x = firstx ls (i-1) @ [x] @ lastx ls ((length ls)-i);;

它的依赖功能是:

let rec firstx ls i = 
  match ls with
  | [] -> []
  | x::xs -> if i <> 1 then x::firstx xs (i-1) else [x];;

let rec reverse ls = 
 match ls with
  |[] -> []
  | x::xs -> reverse xs @ [x];;

let lastx ls i = reverse (firstx (reverse ls) i);;

let rec length ls = 
  match ls with
  | [] -> 0
  | x::xs -> 1+length xs;;

let rec getn ls i = match ls with
  | [] -> raise (Failure "empty list")
  | first::rest -> 
    if i = 0 then first 
    else getn rest (i-1);;

1 个答案:

答案 0 :(得分:1)

实际上,如果您尝试替换列表的第二个元素,replacex函数将无法正常工作。这导致调用firstx,第二个参数等于0。在这种情况下,firstx的实现会返回完整列表。你应该修改索引,或者重新考虑什么是第一个零元素。