1つのリストを取得して重複をチェックするこの関数があります。重複が見つかった場合は、次のように新しいリストに追加されます。
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#の組み込み関数を使用したくないということです。
すでにリスト処理に関する基本的な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
filter
同様の機能がどのように実装されているかを説明するF#の紹介がたくさんあります。F#wikibookはこのトピックをカバーしており、ほとんどのF#ブック(fsharp.orgのリストを参照)にあり、www.tryfsharp.orgのワーキングリストセクションもこれをカバーしています。