Gadget Asked:2020-12-13 04:05:35 +0000 UTC2020-12-13 04:05:35 +0000 UTC 2020-12-13 04:05:35 +0000 UTC F# 描述一个从列表中删除每隔一个元素的函数 772 如果您不能使用 List 模块的内置函数,如何描述一个从列表中删除每个第二个元素的函数? f# 1 个回答 Voted Best Answer user227049 2020-12-28T03:31:14Z2020-12-28T03:31:14Z 由于条件表明您不能使用 List 模块中的标准函数,因此一种可能的解决方案如下: let removeSnd list = let rec loop list acc = match list with | [] -> acc | [h] -> h::acc | h::_::t -> loop t (h::acc) loop list [] |> List.rev 如果我们假设没有限制,那么我建议您使用列表生成器(序列、数组)。我们F#4.0添加了一个适合这种情况的功能List.indexed: let removeSnd2 s = [ for ind, x in List.indexed s do if ind % 2 = 0 then yield x ] 如果由于某种原因新版本对您不可用,您可以使用Seq.zip元组索引和元素: let removeSnd1 s = [ for ind, x in Seq.zip [0..List.length s] s do if ind % 2 = 0 then yield x ] 请注意,它被用来Seq.zip代替List.zip,因为 后者在尝试匹配两个具有不同数量元素的列表时会抛出异常。 对于初学者来说,即使是这样一个简单的任务也是“习惯”使用标准模块中的函数的好方法,所以这里有几个选项分别使用List.mapi, List.foldBack, List.choose: let removeSnd3 seq = seq |> List.mapi (fun i el -> i, el) |> List.filter (fun (i, _) -> i % 2 = 0) |> List.map snd let removeSnd4 lst = lst |> List.zip [1 .. List.length lst] |> List.foldBack (fun (i, x) acc -> if i % 2 = 0 then acc else x::acc) <| [] let removeSnd5 lst = lst |> List.zip [1 .. List.length lst] |> List.choose (function | i, x when i % 2 <> 0 -> Some x |_ -> None)
由于条件表明您不能使用 List 模块中的标准函数,因此一种可能的解决方案如下:
如果我们假设没有限制,那么我建议您使用列表生成器(序列、数组)。我们
F#4.0添加了一个适合这种情况的功能List.indexed:如果由于某种原因新版本对您不可用,您可以使用
Seq.zip元组索引和元素:请注意,它被用来
Seq.zip代替List.zip,因为 后者在尝试匹配两个具有不同数量元素的列表时会抛出异常。对于初学者来说,即使是这样一个简单的任务也是“习惯”使用标准模块中的函数的好方法,所以这里有几个选项分别使用
List.mapi,List.foldBack,List.choose: