hri*_*isc 1 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
Run Code Online (Sandbox Code Playgroud)
这看起来像足球杯(和其他一些运动)的点系统.我们最好的目的是计算一个计算一个这样的元组的得分的东西,而不是实现计算总和的函数,所以我们不会这样做:
score :: Ord a => (a, a) -> Int
Run Code Online (Sandbox Code Playgroud)
通过使用aas类型,我们可以使用任何类型的值,只要我们可以比较它们(Ord类型约束).所以我们可以这样写:
score (x, y) = -- ...
Run Code Online (Sandbox Code Playgroud)
现在以防万一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
Run Code Online (Sandbox Code Playgroud)
所以现在我们可以执行a 计算map score得分列表,通过使用sum,我们可以计算这些点的总和,如:
calculateWins :: Ord a => [(a, a)] -> Int
calculateWins = sum . map score
Run Code Online (Sandbox Code Playgroud)