【发布时间】:2019-08-14 17:02:51
【问题描述】:
我正在编写 SML 程序来更新列表中的记录。例如,我输入了 person_name。
type person_name = {fname:string, lname:string, mname:string}
然后我有 person_bio,其中嵌入了 person_name。
type person_bio = {age:real, gender:string, name:person_name, status:string}
接下来我有一个拥有 person_bio 的员工。
type employee = {p:person_bio, payrate:real, whours:real} list;
现在,我必须通过传递名字来定义函数“updateLastName”。
截至目前,使用以下数据创建了一条记录“e1”。
{p={age=40.0,gender="M",name{fname="rob",lname="sen",mname=""},status="M"},
payrate=30.0,whours=10.0}
但我面临遍历列表然后更新记录中的一个字段的挑战。
fun updateLastName(x:string,l:employee)=
if (L=[]) then []
else if (x= #fname(#name(#p hd l)) //cheking name of 1st record in list
//not getting how to update,this kind of line did not work
#fname(#name(#p hd l) = "abc"
else updateLastName(x,tl(l)); // hope this is right
请提出建议。
【问题讨论】:
-
SML 中的值是不可变的,
#fname(#name(#p hd l) = "abc"是一个比较。您需要使用更新的记录构建一个新列表。 (并阅读模式匹配——它让一切变得不那么凌乱,更具可读性。) -
从比记录更简单的东西开始,比如整数。
-
谢谢,我有点困惑。要仅更新 lname,如果无法直接更新,我必须以某种方式删除并添加它?
-
我这样做是为了更新姓氏,但没有工作。有趣的 updateLname(fnm:string,lnm:string,[]) = [] | updateLname(fnm:string,lnm:string,x::xs)= ( if fnm= (#fname ( #name ( #px))) then if lnm (#lname ( #name ( #p ( x)) )) 然后 lnm else (#lname ( #name ( #p ( x))))) :: updateLname(fnm,lnm,xs)
标签: functional-programming sml smlnj