gpt4 book ai didi

F# 删除列表中第一次出现的元素

转载 作者:行者123 更新时间:2023-12-05 01:23:22 24 4
gpt4 key购买 nike

我想删除可能有重复项的列表中给定元素的第一次出现。例如,带有 [1; 6; 1].我只想删除 1 一次并返回列表 [6;1]。我当前的实现:

let rec remove l x =
match l with
| [] -> []
| h::t when h = x -> t
| h::t -> h::(remove l h)

这仅适用于我要删除的数字是第一个元素的列表。对于像 [6; 7; 6] 如果我想删除数字 7 并返回 [6; 6].它不会遍历列表并使用我当前的实现删除 7。我该怎么做才能遍历整个列表并仅删除第一次出现的元素?

最佳答案

您遇到的问题在代码的最后一行

let rec remove l x =
match l with
| [] -> []
| h::t when h = x -> t
| h::t -> h::(remove l h)
^^^^^^^^^^^
  1. 您想保留头部 h 并处理尾部 t 但是代码没有这样做,引用 hl,而不是 tx

  2. remove 的类型签名被正确推断为 'a list-> 'a -> 'a list 但在最后一场比赛分支。它使用 h 而不是 x 作为元素来移除参数。

  3. 第一个参数也不正确,因为引用 l 在每次递归中都不会改变。它需要引用最新的tail t

所以最后一个匹配分支应该是:

| h::t -> h::(remove t x)

这里是修改后的完整代码;

let rec remove l x =
match l with
| [] -> []
| h::t when h = x -> t
| h::t -> h::(remove t x)

关于F# 删除列表中第一次出现的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72483988/

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