我正在尝试在F#中定义一个具有id和value的类型,并且在排序时只考虑该值。我已经简化了这个情况,希望能有一个明确的例子。
到目前为止,我有以下内容:
[<CustomEquality; CustomComparison>]
type EquatableValue<'T when 'T : comparison> =
{ id : string; value : 'T }
override x.Equals(yobj) =
match yobj with
| :? EquatableValue<'T> as y ->
x.value = y.value
| _ -> false
override x.GetHashCode() =
hash x.value
interface System.IComparable with
member x.CompareTo yobj =
match yobj with
| :? EquatableValue<'T> as y ->
compare x.value y.value
| _ -> invalidArg "yobj" "cannot compare values of different types"
let a = {id="a";value=5}
let b = {id="b";value=4}
let c = {id="c";value=7}
let d = {id="d";value=1}
let x = [a,b,c,d]
let sorted = x |> List.sort
我希望sorted
的元素按顺序(通过id)d,b,c,a。
但这导致a,b,c,d的顺序。
任何人都可以帮我理解我做错了吗?
非常感谢。
答案 0 :(得分:6)
您的列表只包含一个元素 - 由4个值组成的元组:
let x = [a,b,c,d]
使用
let x = [a;b;c;d]
因为列表元素除以';'