私は F# について少し読んでいて、試してみることにしました。少し複雑な例から始めて、思いついたのですが、すぐに迷子になりました。誰かがそれについていくつかの考えを共有できるかどうか疑問に思います.
ComparisonStrategy<'T>
のインスタンスを返すというメソッドを書きたかったのIEqualityComparer<'T>
です。可変長のComparisonWhichAndHow<'T>
インスタンスを取り込みます。タイプComparisonWhichAndHow<'T>
は次のいずれかです。
- type の 1 つの関数。
('T -> *)
比較する単一のフィールドを選択するメソッドです。 - デフォルトまたはで使用し
('T -> 'U, IEqualityComparer<'U>)
たくない場合の 2 タプル。Equals
GetHashCode
'U
これをしばらくビジュアルスタジオで書き込もうとしましたが、関数宣言の部分さえ正しくできません。これを乗り越えることができれば、メソッド本体を実装できると確信していますが、できないようです。
編集:
これは私がこれまでに試したコードです。
私は次の2つのことを達成しようとしています。
- オブジェクトごとに equal メソッドを生成する一般的な方法を考え出します。
- 一部のビジネス オペレーションでは、2 つのオブジェクトの一部のフィールドとその子の一部のフィールドを比較する必要がある場合があります。完全な比較ではありません。私はそれらのコードをより簡潔でシンプルに書こうとしています
これは私がこれまでに持っているものです:
module Failed =
open System.Collections.Generic
open System
type ComparsionOption<'T, 'U> =
| Compare of ('T -> 'U)
| CompareWith of ('T -> 'U) * IEqualityComparer<'U>
// TO USE: [<ParamArray>]
// TODO: this method returns a dummy for now
let CompareStrategy (opts : ComparsionOption<'T, _> array) =
EqualityComparer<'T>.Default
// How it's used
type Person(name : string, id : Guid) =
member this.Name = name
member this.ID = id
let fullCompare : EqualityComparer<Person> =
CompareStrategy [|Compare(fun (p : Person) -> p.Name);
CompareWith((fun (p : Person) -> p.ID), EqualityComparer<Guid>.Default)|] // error here