gpt4 book ai didi

f# - F# 集的覆盖比较

转载 作者:行者123 更新时间:2023-12-03 23:24:00 26 4
gpt4 key购买 nike

有没有办法覆盖 F# 集中的比较函数?

我没有看到任何带 IComparer<T> 的集合构造函数或比较功能:

  • Set.ofSeq等人不带比较函数
  • FSharpSet(IComparer<T> comparer, SetTree<T> tree)构造函数是内部的,因为
  • SetTree 是内部和
  • SetTreeModule.ofSeq<a>(IComparer<a> comparer, IEnumerable<a> c)显然也是内部的。

  • 我的实际问题是我有一组 ('a * 'a)我想要一个比较,例如 (1,3) = (3,1)。

    我知道我可以将它包装在实现 IComparable<T> 的类型中,但有没有办法避免这种情况?

    最佳答案

    我认为set F# 核心库中可用的类型不允许指定您自己的比较。但是,PowerPack 中有一个标记版本的类型允许这样做。下面显示了如何使用比较器创建一个集合,该集合使用模 10 来比较整数:

    #r @"FSharp.PowerPack.dll"
    open System.Collections.Generic
    open Microsoft.FSharp.Collections.Tagged

    type MyComparer() =
    interface IComparer<int> with
    member x.Compare(a, b) = (a % 10).CompareTo(b % 10)

    // Type alias for a set that uses 'MyComparer'
    type MySet = Tagged.Set<int, MyComparer>

    let comparer = new MyComparer()
    let s1 = MySet.Create(comparer, [1; 2; 3])
    let s2 = MySet.Create(comparer, [11; 14])

    MySet.Union(s1, s2)

    关于f# - F# 集的覆盖比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2572084/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com