go proposal: cmp: add Reverse function

watbbzwu  于 5个月前  发布在  Go
关注(0)|答案(6)|浏览(53)

提案详情

我建议向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。

iaqfqrcu

iaqfqrcu2#

"sort"包已经为sort.Interface提供了一个Reverse函数,因此对于"cmp"包来说,一个Reverse函数也同样适用。参考链接:https://pkg.go.dev/sort#Reverse

368yc8dk

368yc8dk3#

解:$x_{1m0n1} x$不需要是 $x_{1m1n1} x$.这个函数可以反转两个 $x_{1m2n1} x$ 类型值上的任何比较器。

$x_{e0f1} x$

llew8vvj

llew8vvj4#

你说得对。我会更新提案。

oxosxuxt

oxosxuxt5#

在这里思考,实现应该是 fn(y,x) 还是 -fn(x,y) ?也许如果 fn 是一个严格的弱序关系,那么它就无关紧要了?

t40tm48m

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 ,但我并不是完全坚持这种方式。

相关问题