我试图在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的顺序.
谁能帮助我理解我做错了什么?
非常感谢.
您的列表只包含一个元素 - 由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)
因为列表的元素除以 ';'