gpt4 book ai didi

F# 更改列表中的元素并返回完整的新列表

转载 作者:行者123 更新时间:2023-12-04 17:43:35 25 4
gpt4 key购买 nike

我有一个类型为 (string * (int * int)) list 的列表.我希望能够搜索列表,通过它的 string 找到正确的元素标识符,对 ints 之一进行计算,然后返回完整的、修改过的列表。

例子:

给出一个列表
let st = [("a1",(100,10)); ("a2",(50,20)); ("a3",(25,40))]
我正在尝试创建一个函数,该函数获取其中一个元素并从 ints 之一中减去数字。在元组中。

get ("a2",10) st 
//Expected result: st' = [("a1",(100,10)); ("a2",(40,20)); ("a3",(25,40))]

我觉得我快到了,但对以下功能有点卡住了:
let rec get (a,k) st =
match st with
| (a',(n',p'))::rest when a'=a && k<=n' -> (n'-k,p')::rest
| (a',(n',p'))::rest -> (n',p')::get (a,k) rest
| _ -> failwith "Illegal input"

这将返回 [("a2",(40,20)); ("a3",(25,40))]因此缺少第一个 a1元素。任何提示?

最佳答案

列表是不可变的,所以如果你想“改变一个元素”,你实际上是在创建一个转换了一个元素的新列表。进行此类转换的最简单方法是使用 List.map功能。我会写这样的东西:

let updateElement key f st = 
st |> List.map (fun (k, v) -> if k = key then k, f v else k, v)
updateElement是一个接受键、更新函数和输入的辅助函数。它返回具有给定键的元素已使用给定函数转换的列表。例如,增加与 a2 关联的第一个数字, 你可以写:
let st = [("a1",(100,10)); ("a2",(50,20)); ("a3",(25,40))]

st |> updateElement "a2" (fun (a, b) -> a + 10, b)

关于F# 更改列表中的元素并返回完整的新列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com