Ocaml 覆盖sml列表中的元素

Ocaml 覆盖sml列表中的元素,ocaml,sml,smlnj,Ocaml,Sml,Smlnj,我在下面声明了这个函数,希望如果我要覆盖列表中的某个元素,它会起作用。但我不完全确定这是不是正确的方法。任何与我不同的想法都将受到欢迎 fun foo (ls,n) =if ls = nil then nil else ( rev ( 1::List.rev ( List.take (ls,n-1 ))))@(List.drop (ls,n) 应该是这样的 foo ([0,3,9],2) = [0,1,9] (此代码的右括号太少。) 我认为这种方法没有什么大问题,特别是如果您不想编写自己的

我在下面声明了这个函数,希望如果我要覆盖列表中的某个元素,它会起作用。但我不完全确定这是不是正确的方法。任何与我不同的想法都将受到欢迎

fun  foo (ls,n) =if ls = nil then nil else ( rev ( 1::List.rev ( List.take (ls,n-1 ))))@(List.drop (ls,n)
应该是这样的

foo ([0,3,9],2) = [0,1,9]
(此代码的右括号太少。)

我认为这种方法没有什么大问题,特别是如果您不想编写自己的显式递归解决方案。如果在第二部分的开头而不是第一部分的结尾添加新值,我认为不需要做太多的反转。如果您编写自己的函数,就可以避免一些重复的工作。您可能需要查看
List.revAppend
,它适用于此类情况


附带说明:对于随机位置的更新,列表不是一个特别好的数据结构。

您在那里做了很多不必要的工作<代码>获取,
删除
修订
@
都涉及到遍历列表-当你只需要做一次时,你会做五次。如前所述,只需将
1
添加到
drop
的结果中,就可以消除
rev
调用,但仍有改进的余地

您应该尝试编写自己的递归函数,该函数不依赖于
列表中的任何内容。你真的需要对递归思维有一个直观的理解,才能在函数式编程中取得成功。调用顺序应如下所示:

  foo ([a,b,c,d], 4)
= a :: foo([b,c,d], 3)
= a :: b :: foo([c,d], 2) ...