如何 return 具有更新值的新类型

how return a new type with an update value

如果我想更改列表中的值,我将return一个包含新值的新列表,而不是更改旧列表中的值。

现在我有四种类型。我需要更新 varEnd 中的值位置,而不是更改值,我需要 return 一个具有更新值

的新类型
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 会是更好的选择。

我遇到的最大问题是有四种不同的类型。

我想你是说你知道如何通过构建新列表来更改列表中的元素。

现在您想对环境执行此操作,而环境是一系列非常复杂的事情。但这没有什么区别,改变列表的方法是一样的。唯一不同的是,重置值会是一件复杂的事情。

我不知道你说你有四种类型是什么意思。我看到这里列出的类型不止四种。但另一方面,一个环境似乎基本上包含两种不同类型的东西。

也许(但也可能不是)您是在说您不知道如何仅更改记录的四个字段之一而同时保持其他字段不变的好方法。这是一个很好的答案。假设 x 是 varEnd 类型的东西。然后你可以说:

{ x with l = loc }

如果您实际上不知道如何通过创建新列表来修改列表的元素,那么首先要弄清楚的就是这个问题。可以用fold来做,其实用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