2014-02-28 59 views
0

我有一个元组列表,我想工作的平均所以: (所有INT的总和)/列表长度哈斯克尔划分第二个元素的总和元组

名单看​​起来像:

[("Student1", 1), ("Student2", 2), ("Student3", 3)] 

到目前为止,我有一个就将此了所有的“年龄”(1,2 & 3)函数,但我不知道如何相结合与列表长度的一个部门。

功能:

addMarks :: [(String, Int)] -> Int 
addMarks list = sum . map snd/length(list) 

长度(名单)给了我3,所以如果我可以通过长我会得到我的平均分相加功能。

没有lamda表达式如果亚可以,

谢谢! Tom

回答

2

使用div功能,如果你想在Int的结果。使用/将给出分数结果。此代码应工作:

addMarks :: [(String, Int)] -> Int 
addMarks list = sum (map snd list) `div` length(list) 

还是更清洁的版本:

addMarks :: [(String, Int)] -> Int 
addMarks list = sum nums `div` length nums 
    where nums = map snd list 

您也可以使用/功能解决这个。您必须使用fromIntegral等功能将它们转换为正确的类型。

+0

+1,谢谢你,正是我在找的东西! 但是,我希望它是一个浮点数 - 因为它计算出的平均值和平均值需要允许小数点。 虽然将'div'更改为'/'会给我输入错误。有什么建议吗? – user3053434

+1

更改您的类型签名以指示您希望将“Float”作为输出。然后使用'fromIntegral'函数将它们正确转换。 – Sibi