我的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);;
答案 0 :(得分:1)
实际上,如果您尝试替换列表的第二个元素,replacex
函数将无法正常工作。这导致调用firstx
,第二个参数等于0
。在这种情况下,firstx
的实现会返回完整列表。你应该修改索引,或者重新考虑什么是第一个零元素。