我是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
答案 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函数。
在简单地询问完整的代码之前,请先尝试这些事情;这对我们两个都没有帮助。