0

我有这个函数,它需要一个列表并检查重复项,如果发现任何重复项,它们将被添加到一个新列表中,如下所示:

let foo1 z list = list |> List.filter (fun e -> e <= z)

这给了 foo1 1 [2;3;4;1;5;1;6;1] => [1;1;1] 问题是我不想在 f# 中使用任何内置函数

4

1 回答 1

4

您已经就列表处理提出了一些基本的 F# 问题,因此我建议您先阅读一些介绍,然后自己尝试一下。

使用内置函数是解决实际问题的正确方法。如果您想学习 F# 并了解递归,请先阅读上述内容。然后你应该能够写出类似的东西:

let rec duplicates z = function
  // If the list is empty, return empty list of duplicates
  | [] -> []
  // If it starts with 'z' then return one duplicate and recursively process the rest
  | x::xs when x = z -> x::(duplicates x xs)
  // If it starts with something else, then skip the first element and process the rest
  | x::xs -> duplicates z xs

有许多 F# 介绍解释了如何filter实现类似的功能。F# wikibook 涵盖了这个主题,您会在大多数 F# 书籍中找到它(请参阅fsharp.org 上的列表) ,www.tryfsharp.org 上的工作列表部分也涵盖了这个主题。

于 2012-11-27T12:17:48.793 回答