【问题标题】:Haskell List of Tuples Compare PairHaskell 元组列表比较对
【发布时间】:2018-04-22 20:27:23
【问题描述】:

我是 Haskell 的新手,我正在尝试一些东西。我在比较元组元素时遇到了一些问题。

假设我有一个元组[(1,3),(2,1),(4,4)]。 我想将每对索引相互比较,并将一些数据保存到计数器值中并返回该值。

例如我想要的是这样的: 元组:[(a,b),(c,d),(e,f)]
a>b我想add 3到柜台。
a==b 我想add 1 到柜台。
否则add 0 到柜台。 (c,d)(e,f) 相同。
遍历我的元组后,我想返回计数器。

所以在我的示例中,我有元组 [(1,3),(2,1),(4,4)]
该功能应该做
由于1<3 将 0 添加到计数器。
由于2>1 计数器加 3。
由于4=4 计数器加 1。
毕竟返回0+3+1 = 4

有什么想法吗?提前谢谢!

(编辑)

calculateWins :: [(Int,Int)]->Int           
calculateWins d ((a,b) :xs) = x
    where x 
     |a>b   =   3
     |a==b  =   1
     |otherwise =   0

【问题讨论】:

  • 对某事感到陌生并不是不努力的借口。请展示你尝试了什么,什么没用,你有什么想法,为什么这些都不成功。
  • 此外,[(1,3),(2,1),(4,4)] 不是 元组,它是 2 元组的 列表
  • @WillemVanOnsem 是的,你是对的。对不起,这确实是一个元组列表。我已经编辑了帖子,添加了一些我编写的代码,但我一开始并没有这样做,因为我认为这不值得一提。

标签: haskell compare tuples


【解决方案1】:

这看起来像足球杯(以及其他一些运动)的积分系统。与其实现一个计算总和的函数,我们最好首先计算一些东西来计算 one 这样的元组的分数,比如:

score :: Ord a => (a, a) -> Int

通过使用a 作为类型,我们可以使用任何类型的值,只要我们可以比较它们(Ord 类型约束)。所以我们可以这样写:

score (x, y) = -- ...

现在如果x > y,那么得分是3分,如果是x == y,那么得分是1点,最后如果是x < y(否则),那么得分是@ 987654330@分,所以我们可以写成:

score :: Ord a => (a, a) -> Int
score (x, y) | x > y = 3
             | x == y = 1
             | otherwise = 0

所以现在我们可以执行map score 来计算分数列表,通过使用sum,我们可以计算这些分数的总和,例如:

calculateWins :: Ord a => [(a, a)] -> Int
calculateWins = sum . map score

【讨论】:

  • 我还可以问你点别的吗?在我的示例中,元组列表表示团队给出的某些匹配的结果。在每个元组 (a,b) 中,a 代表我队的进球,b 代表对方球队的进球。例如,元组列表 `[(1,3),(2,1),(4,4)]` 表示我的团队提供的 3 次匹配。如何才能获得每场比赛的进球数之间的最大差异?例如,如果我的球队至少赢了一场,这个数字应该大于 0,如果没有赢,并且至少有一个偶数得分,那么这个数字应该是 >0,如果我的球队在所有比赛中都输了,这个数字应该是负数。示例 [(1,5)] 我想要 -4
  • 例如:[(0,1),(1,3),(1,2)] 我要-1。我猜代码与上面的代码相似,所以我希望你能帮助我。
  • 你可以执行另一个映射,然后使用maximum 而不是sum,一个很短的实​​现是maximum . map (uncurry (-))
  • 我认为我不清楚自己想要什么。让我解释。我有元组列表 [(8,1),(2,3),(3,3),(2,0)]。我队2胜1平。我想要最佳比赛的目标之间的差异。最好的比赛是进球数之差最大的比赛。在这种情况下,8-1 是最佳匹配,因此返回值为 8。但是,此值不仅取决于分数,还取决于一般结果。如果我的球队至少有一场胜利,则该值 >0,如果没有胜利且至少有一个偶数得分(任何情况),则该值为 0,如果我的球队在所有比赛中均被击败,则该值为负数。
  • @hristoforidisc:准确地说,如果你定义了bestmatch = maximum . map (uncurry (-)),那么你可以用bestmatch [(8,1),(2,3),(3,3),(2,0)]调用它,这将产生7
【解决方案2】:

提示:使用 (a -> b) -> [a] -> [b] 类型的函数将元组列表转换为和数列表(3 或 1 或 0),并使用 [a] -> a 类型的另一个函数来获取总和。

Hoogle 是一个非常好的站点,可以通过名称和签名查找 Haskell 函数。

在简单地询问完整代码之前,请先尝试这些事情;这对我们俩都没有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多