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