2015-04-29 57 views
0

如果我想更改列表中的值,我將使用新值返回一個新列表,而不是更改舊列表中的值。如何返回具有更新值的新類型

現在我有四種類型。我需要更新varEnd的價值定位,而不是改變的價值,我需要用更新值

type varEnd = { 
v: ctype; 
k: varkind; 
l: location; 
} 
;; 

type varStart = { 
ct: ctype; 
sy: sTable; 
n: int; 
stm: stmt list; 
e: expr 
} 

and sEntry = Var of varEnd | Fun of varStart 
and sTable = (string * sEntry) list 
type environment = sTable list;; 

(a function where environment is the only parameter i can use) 
let allocateMem (env:environment) : environment = 

我試圖用List.iter返回一個新的類型,但它直接改變值,類型也不可變。我認爲List.fold將是一個更好的選擇。

我最大的問題是有四種不同的類型。

回答

0

我想你是說你知道如何通過構建一個新列表來改變列表的一個元素。

現在你想對環境做這件事,而環境是一些相當複雜的事情。但是這並沒有什麼區別,改變列表的方式是一樣的。唯一的區別是重置價值將是一件複雜的事情。

當你說你有四種類型時,我不知道你的意思。我在這裏列出了四種以上的類型。但另一方面,環境似乎包含基本上兩種不同類型的東西。

也許(但可能不是)你說你不知道改變記錄的四個字段中的其中一個的好方法,而讓其他字段保持不變。這是一個很好的答案。假設x是varEnd類型的東西。然後,你可以說:

{ x with l = loc } 

如果,其實你不知道如何通過創建一個新的列表修改列表的元素,那就是先弄清楚事情。你可以用摺疊來做,但實際上你也可以用List.map這樣做,這有點簡單。你不能用List.iter做到這一點。

更新

假設我們有一個記錄類型是這樣的:

type r = { a: int; b: float; } 

這裏是一個函數,它r list list,並增加了1.0的那些記錄a字段0

b領域
let incr_ll rll = 
    let f r = if r.a = 0 then { r with b = r.b +. 1.0 } else r in 
    List.map (List.map f) rll 

該函數的類型是r list list -> r list list

+0

我知道如何通過創建一個新列表來修改列表元素,但我在這裏有很多列表,我不知道如何使用環境獲取最後一個列表,然後返回一個新列表與新位置。 – user2247155

+0

對不起,我不明白你需要什麼。一個環境*是一個列表。如果你所說的是你需要實現'allocateMem',那麼它的參數就是一個列表,並且它返回一個相同類型的列表。正是你說的你知道該怎麼做。 –

+0

對不起,我沒有說清楚。我需要更新位置的值。爲了得到varEnd,我需要首先訪問sTable和sEntry。這就是我陷入困境的地方。當有另一個列表裏面有一個列表時,我會感到困惑 – user2247155