2014-10-04 28 views
0

上下文:

我试图在insert S上的元件x在列表中,在定义一个函数要么head或列表的tail,基于断是否新元素小于当前列表中的head保存OCaml中的附加列表

问题:

的问题是,当我运行一些代码,我创建了(在底部显示),我的表是回到原来的状态,而不是保存以前是追加完成。我意识到,我可以用一个简单的let声明一个新的变量或相同的,但我想保存新的列表作为其当前的形式。如果没有创建新列表,这甚至可以在中完成吗?

我的问题是:我如何可以追加到列表,并将其保存在其新的形式,没有一个新的列表或变量的创建。

研究:

我看着this answer on SO,并在我的代码已经把它已经。然而,当我运行此代码:

let rec insertion x y = 
    match y with 
    | [] -> x::y 
    | h::tl -> if h >= x then x::y 
       else   [email protected][x] 
;; 

,伴随着:

let y = [1;2;3];; 
insertion 0 y ;; 
y    ;; 

我回:

val y : int list = [1; 2; 3] 
- : int list = [0; 1; 2; 3] 
- : int list = [1; 2; 3] 

回答

1

这是不可能的。 OCaml的列表是不可改变的,你不能改变它。你不能改变它的值,你不能改变它的长度。

+0

谢谢!我觉得这有点奇怪,因为我以前的经验总是能够改变列表的形式。这就是说,最好的方式去做这个会做'让nList =插入SOME_VAL SOME_LIST'?如果是这样,你介意这是否添加到你的答案? – 2014-10-04 23:15:08

+1

OCaml是函数式编程语言。因此,默认情况下,大多数数据结构都是不可变的(或者说我们说的持久性数据)。另外,请注意,表达式'let var = expr'实际上并没有将'var'的值更改为'expr',它只是创建一个新的绑定,即将一个名称'var'绑定到某个对象' expr'。如果它刚刚发生,那么在当前范围内这样的名称已经存在,那么它只是被隐藏了(参见python的地图)。这就是为什么我们试图不使用术语“变量”,因为它可能会让新手感到困惑。我们使用名称和值。希望这可以帮助! – ivg 2014-10-04 23:23:04

+0

再次感谢!我也想澄清这一点,因为我之前评论中的代码片段是我正在寻找的一个解决方案(但不愿意使用>,<)。再次感谢您的时间! – 2014-10-04 23:26:55