1
let standard = (0, 4.5M, 4L)
let tuples = [| ("A", -2, 1.0M, 2L); 
                ("B", -1, 2.0M, 3L); 
                ("C", 0, 3.0M, 4L); 
                ("D", 1, 4.0M, 5L); 
                ("E", 2, 5.0M, 6L) |]
let qualified = tuples
              |> Array.sortBy(fun (_, a, b, c) -> (a, -b, c))
              |> Array.filter(fun (_, a, b, c) -> (a, b, c) <= standard)
printfn "%A" qualified

タプルの配列と標準があります。タプルをソートして、要件を満たすタプルをピックアップしたいと考えています。
タプルについては、最初の要素を無視し、2 番目の要素と 4 番目の要素を通常の方法で並べ替えますが、3 番目の要素も逆の順序で並べ替えます。2 番目の要素を含むすべてのタプルは少なくとも標準と同じ大きさであり、3 番目の要素は最大で標準と同じ大きさであり、修飾されたタプルです。上記の例では、修飾されたタプルは次のとおりです。("C", 0, 3.0M, 4L) |] 条件は次のとおりです: 2 番目の要素 >= 0 および 3 番目の要素 <= 4.5M および 4 番目の要素 >= 4L しかし、私のコードは機能しませんでした! この仕事をすることができる関数を書く方法を教えてください! ありがとう、良い週末を。ジョン

4

2 に答える 2

3

タプルで機能する組み込みの比較を使用して、必要なことを行う賢い方法はないと思います。主な問題は、比較が最初の要素を最も重要なものとして扱うため、最初のいくつかの要素のみを使用することを決定することです (残りの値は考慮しません。条件はすべての要素に対する制限を指定します。したがって、Gustavo からの解決策はおそらく最も簡単な方法です。

ただし、いくつかの細かい点があります。まず、並べ替え関数で並べ替える要素が少なくなるため、並べ替えの前にフィルター処理を実行することをお勧めします。

 let qualified = 
   tuples 
   |> Array.sortBy (...) 
   |> Array.filter (...)

簡単に変更できるグローバル値で条件を表現したい場合は、必要な最小値/最大値を指定する 3 つの値を持つタプルを作成するだけでは十分ではありません。値が最小値か最大値かがわからないためです。ただし、条件を指定する関数のタプルを使用できます。

let standard = ((fun _ -> true), (<=) 0, (>=) 4.5M, (<=) 4L) 

これは、最初の要素のすべての値が OK であり、2 番目の要素の値が 0 よりも大きくなければならない (を受け取って返す(<=) 0関数を表す) などを指定します。次に、次のように記述できます。x0 <= x

let conditionsHold (p1, p2, p3, p4) (v1, v2, v3, v4) = 
  p1 v1 && p2 v2 && p3 v3 && p4 v4

let qualified = 
  tuples 
  |> Array.sortBy(fun (_, a, b, c) -> (a, -b, c)) 
  |> Array.filter (conditionsHold standard)
于 2011-12-04T17:24:28.247 に答える
2

次の最後の行を変更するだけです。

Array.filter(fun (_, a, b, c) -> let (x,y,z) = standard in a >= x && b <= y && c >= z)

タプル( "D"、1、4.0M、5L)も対象となることに注意してください。

アップデート:

Tomasは正しいです、最初にフィルタリングする方が良いです。それを解決するためのもう1つの興味深い関数型の方法は、3アップルをアプリケーションファンクターにすることです。

let pure' x = (x,x,x)
let (<*>) (f,g,h) (x,y,z) = (f x, g y, h z)

let standard = (0, 4.5M, 4L)
let tuples = [| ("A", -2, 1.0M, 2L); 
                ("B", -1, 2.0M, 3L); 
                ("C", 0, 3.0M, 4L); 
                ("D", 1, 4.0M, 5L); 
                ("E", 2, 5.0M, 6L) |]
let qualified = tuples              
              |> Array.filter(fun (_, a, b, c) -> ((>=),(<=),(>=)) <*> (a,b,c) <*> standard = pure' true)
              |> Array.sortBy(fun (_, a, b, c) -> (a, -b, c))
于 2011-12-04T17:07:11.003 に答える