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

JPJ*_*PJY 2 f#

我试图在F#中定义一个具有id和值的类型,并且在排序时只考虑该值.我简化了这种情况,以便做出一个充满希望的明确例子.

到目前为止,我有以下内容:

[<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
Run Code Online (Sandbox Code Playgroud)

我希望元素sorted的顺序(通过id)d,b,c,a.

但这导致a,b,c,d的顺序.

谁能帮助我理解我做错了什么?

非常感谢.

Pet*_*etr 6

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

let x = [a,b,c,d] 
Run Code Online (Sandbox Code Playgroud)

使用

let x = [a;b;c;d] 
Run Code Online (Sandbox Code Playgroud)

因为列表的元素除以 ';'