2011-09-25 77 views
3

我在绕包装如何完成此操作时遇到问题。我在与monads/IO合作方面相对较新,所以如果我错过了某些明显的东西,请原谅。我在谷歌搜索了一段时间,并没有提出任何建议,也没有读到我正在弄清楚如何做到这一点。总结目录中的文件大小

这是我现在有:

import System.Path.Glob (glob) 
import System.Posix.Files (fileSize, getFileStatus) 

dir = "/usr/bin/" 
lof = do files <- (glob (dir++"*")) 
     (mapM_ fileS files) 

fileS file = do fs <- getFileStatus file 
       print (fileSize fs) 

正如你所看到的,这得到了尺寸并打印出来,但我卡在如何真正总结他们。

回答

10

你快到了。你可以有fileS返回文件的大小,而不是打印出来:

return (fileSize fs) 

然后,而不是mapM_ ING(其扔掉的结果),做一个mapM(返回结果的列表):

sizes <- mapM fileS files 

现在sizes是对应于尺寸的数字列表。 sum他们应该很容易:-)

为了加深你对这个例子的理解(并且练习良好的习惯),试着为你的函数编写类型签名。请与:t联系ghci寻求帮助。

+0

谢谢,我现在想通了。像魅力一样工作:) – Wes

+1

+1帮助学习的答案。 –