gpt4 book ai didi

haskell - haskell中有没有一种方法可以通过多个参数和不同的顺序进行紧凑有效的比较

转载 作者:行者123 更新时间:2023-12-05 08:42:13 25 4
gpt4 key购买 nike

假设我们有一个元组列表,我们需要根据某个标准找到最大值。标准如下 - 最重要的是元组的第一个元素(越多越好)次要的是第二个元素(越少越好)。

我知道在 Haskell 中有两种表达方式。

第一个是创建一个函数来进行所有比较并返回 (EQ, LT, GT)

compareSol (s1, w1) (s2, w2) = if weightComp == EQ then sizeComp else weightComp where 
weightComp = compare w1 w2
sizeComp = compare (Map.foldl' (+) 0 s2) (Map.foldl' (+) 0 s1)

第二个是使用 Data.Ord 中的 comparing 并给它一个返回分数的函数 \(x, y) -> ( x, 1/y) 我认为这更具声明性,但需要更多计算 (1/y)

有没有一种方法可以像 sql 一样以声明式和高效的方式表达它?

最佳答案

我无法理解您想要的精确顺序,但您可能正在寻找以下内容的一些变体

compareSol (s1, w1) (s2, w2) = compare (w1, sum s2) (w2, sum s1)

以上等同于

compareSol (s1, w1) (s2, w2) 
| w1 < w2 = LT
| w1 > w2 = GT
| otherwise = compare (sum s2) (sum s1)

或者,完全展开,

compareSol (s1, w1) (s2, w2) 
| w1 < w2 = LT
| w1 > w2 = GT
| sum s1 < sum s2 = GT
| sum s1 > sum s2 = LT
| otherwise = EQ

随意交换比较以实现您的目标。

关于haskell - haskell中有没有一种方法可以通过多个参数和不同的顺序进行紧凑有效的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43155079/

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