2014-10-04 30 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