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) ...