提案详情
我建议向cmp包添加一个小型、无关紧要的附加功能。(编辑:现在已包含@itchynyhere的观察结果。)
// Reverse takes a comparison function and returns the reverse of it.
func Reverse[T any](fn func(x, y T) int) func(x, y T) int {
return func(x, y T) int { return fn(y, x) }
}
例如,
package main
import (
"cmp"
"fmt"
"slices"
)
func main() {
fn := func(x, y int) int { return cmp.Compare(x, y) }
xs := []int{2, 3, 1}
fmt.Printf("%v\n", xs)
slices.SortFunc(xs, fn)
fmt.Printf("%v\n", xs)
slices.SortFunc(xs, Reverse(fn))
fmt.Printf("%v\n", xs)
}
func Reverse[T any](fn func(x, y T) int) func(x, y T) int {
return func(x, y T) int { return fn(y, x) }
}
输出
[2 3 1]
[1 2 3]
[3 2 1]
我发现经常需要Assert某个东西是按升序或降序排列的;将这样的东西写下来很简单,但感觉有些笨拙。
如果大家认为这是一个好主意,我很乐意提交一个带有测试的pull request。
6条答案
按热度按时间20jt8wwn1#
只想指出Rust有这个; https://doc.rust-lang.org/std/cmp/struct.Reverse.html 。
iaqfqrcu2#
"sort"包已经为sort.Interface提供了一个Reverse函数,因此对于"cmp"包来说,一个Reverse函数也同样适用。参考链接:https://pkg.go.dev/sort#Reverse
368yc8dk3#
解:$x_{1m0n1} x$不需要是 $x_{1m1n1} x$.这个函数可以反转两个 $x_{1m2n1} x$ 类型值上的任何比较器。
$x_{e0f1} x$
llew8vvj4#
你说得对。我会更新提案。
oxosxuxt5#
在这里思考,实现应该是
fn(y,x)
还是-fn(x,y)
?也许如果fn
是一个严格的弱序关系,那么它就无关紧要了?t40tm48m6#
@randall77:这是一个值得思考的问题。我相信它们是等价的。
让
fn
是一个类型为func(x, y T) int
的函数,假设一个关于 T 的不对称关系 $<$ 可以按照以下方式定义。(严格弱序是不对称的。)fn(x, y) > 0
,那么 $y < x$。fn(x, y) < 0
,那么 $x < y$。fn(x, y) == 0
,那么既不满足 $x < y$ 也不满足 $y < x$。fn(y, x)
的符号与fn(x, y)
的符号相反。fn(y, x) > 0
,那么 $x < y$,所以fn(x, y)
不能是正数(因为它会破坏不对称性),也不能是零(因为 $x < y$)。fn(y, x) < 0
,那么 $y < x$,所以fn(x, y)
不能是负数(因为它会破坏不对称性),也不能是零(因为 $y < x$)。fn(y, x) == 0
,那么既不满足 $x < y$ 也不满足 $y < x$,所以fn(x, y)
不能是正数或负数。我非常喜欢这种实现方式,因为它直接得到了 the duality ,但我并不是完全坚持这种方式。