我有一个char和整数列表,如[('1',1),('2',2),('3',3),('4',4),('5',5)]
,并希望将整数转换为总数的每个数字的百分比,例如[('1',7),('2',13),('3',20),('4',27),('5',33)]
。我尝试了一个递归函数,它将参数作为(c,i):rest
,然后将i
除以总计,然后使用rest
调用该函数。但是在每个循环之后,总数已经发生了变化。那么有什么方法可以从开始声明总数并像其他语言一样反复使用它。
答案 0 :(得分:2)
您需要提前计算总数 - 您可以使用类似
的内容f :: Integral b => [(a,b)] -> [(a,b)]
f lst = let total = sum $ map snd list
in map (\(x,y) -> (x,(100 * y)`div` total)) lst
注意:最好先收集与每个角色相关联的Integral
- 值,这会使输出更清晰(在我看来),但这对于精明的练习来说是一个练习阅读器。
为了使此功能更加清晰 - 我还建议为newtypes
和Value
引入Percentage
,这样您就不会尝试添加百分比值。
newtype Value a = V {extractV :: a}
newtype Percentage = P {percent :: Integer}
f :: Integral b => [(a,Value b)] -> [(a,Percentage)]