0

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#の組み込み関数を使用したくないということです。

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

filter同様の機能がどのように実装されているかを説明するF#の紹介がたくさんあります。F#wikibookはこのトピックをカバーしており、ほとんどのF#ブック(fsharp.orgのリストを参照)にあり、www.tryfsharp.orgのワーキングリストセクションもこれをカバーしています。

于 2012-11-27T12:17:48.793 に答える