使用具有CustomComparison类型的F#List.sort

时间:2016-02-04 17:17:58

标签: f#

我正在尝试在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的顺序。

任何人都可以帮我理解我做错了吗?

非常感谢。

1 个答案:

答案 0 :(得分:6)

您的列表只包含一个元素 - 由4个值组成的元组:

let x = [a,b,c,d] 

使用

let x = [a;b;c;d] 

因为列表元素除以';'