Functional programming 如何返回具有更新值的新类型

Functional programming 如何返回具有更新值的新类型,functional-programming,ocaml,Functional Programming,Ocaml,如果我想更改列表中的值,我将返回一个带有新值的新列表,而不是更改旧列表中的值 现在我有四种类型。我需要更新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 |

如果我想更改列表中的值,我将返回一个带有新值的新列表,而不是更改旧列表中的值

现在我有四种类型。我需要更新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是一个更好的选择


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

我想你是说你知道如何通过构造一个新列表来更改列表的元素

现在你要对一个环境做这个,环境是一个相当复杂的列表。但这没有任何区别,更改列表的方法是相同的。唯一的区别是,重置价值将是一件复杂的事情

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

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

{ x with l = loc }
事实上,如果您不知道如何通过创建一个新列表来修改列表的元素,那么首先要弄清楚这一点。您可以通过折叠来完成,但实际上您也可以使用稍微简单一点的
List.map
。您不能使用
List.iter

更新

假设我们有这样的记录类型:

type r = { a: int; b: float; }
这里有一个函数,它接受
r列表
,并向
a
字段为0的记录的
b
字段添加1.0

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

我知道如何通过创建一个新列表来修改列表元素,但是我这里有很多列表,我不知道如何使用环境获取最后一个列表,然后返回一个带有新位置的新列表。对不起,我不明白您需要什么。环境是一个列表。如果您的意思是需要实现
allocateMem
,那么它的参数是一个列表,并返回相同类型的列表。正是你说的,你知道怎么做。对不起,我没说清楚。我需要更新位置的值。为了到达瓦伦德,我需要先进入马厩和岗哨。这就是我被困的地方。当另一个列表中有一个列表时,我会感到困惑。这个列表稍微清晰一些,但仍然不完全清晰。从学习足够多的OCaml开始编写您想要编写的函数类型确实是一件好事。我将添加一些处理列表列表的代码。我希望我不是在为你做作业:-)谢谢。不,你不是在做我的家庭作业。这个项目有10个不同的文件,这只是10行