Haskell - 递归函数中未修改的变量

时间:2016-10-10 23:20:32

标签: haskell recursion

我有一个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调用该函数。但是在每个循环之后,总数已经发生了变化。那么有什么方法可以从开始声明总数并像其他语言一样反复使用它。

1 个答案:

答案 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 - 值,这会使输出更清晰(在我看来),但这对于精明的练习来说是一个练习阅读器。

为了使此功能更加清晰 - 我还建议为newtypesValue引入Percentage,这样您就不会尝试添加百分比值。

newtype Value a = V {extractV :: a}
newtype Percentage = P {percent :: Integer}

f :: Integral b => [(a,Value b)] -> [(a,Percentage)]