我一直在阅读 F# 并决定尝试一下。我从一个有点涉及的例子开始,我想出了并立即迷路了。我想知道是否有人可以分享一些想法。
我想编写一个名为的方法,该方法ComparisonStrategy<'T>
返回一个IEqualityComparer<'T>
. 它接受可变长度的ComparisonWhichAndHow<'T>
实例。类型ComparisonWhichAndHow<'T>
可以是:
- type 的一个函数
('T -> *)
,它是一种选择单个字段进行比较的方法 - 一个 2 元组,
('T -> 'U, IEqualityComparer<'U>)
如果您不希望使用默认值Equals
或GetHashCode
用于'U
.
我已经尝试在 Visual Studio 上画了一段时间,但我什至无法正确地获得函数声明部分。我有点肯定,如果我能克服这个问题,我将能够实现方法体,但似乎我做不到。
编辑:
这是我到目前为止尝试过的代码。
我正在努力实现以下两件事。
- 想出一种为每个对象生成相等方法的通用方法。
- 有时某些业务操作可能需要比较 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