Haskell元组列表比较对

时间:2018-04-22 20:27:23

标签: haskell compare tuples

我是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

2 个答案:

答案 0 :(得分:6)

这看起来像足球杯(以及其他一些运动项目)的分数系统。我们最好的目的是计算计算一个这样的元组得分的东西,而不是实现计算总和的函数,如下所示:

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

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

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

现在以x > y为例,分数为3分,如果是x == y,则分数为1分,最后为x < y (否则),得分为0分,所以我们可以把它写成:

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

答案 1 :(得分:2)

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

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

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