对目录中的文件大小求和

Wes*_*Wes 3 io monads haskell

我无法绕过如何实现这一目标.我对使用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)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这会得到尺寸并打印出来,但我仍然坚持如何实际求和它们.

luq*_*qui 10

你快到了.您可以fileS返回文件大小而不是打印它:

return (fileSize fs)
Run Code Online (Sandbox Code Playgroud)

然后,mapM_执行a mapM(返回结果列表)而不是ing(抛弃结果):

sizes <- mapM fileS files
Run Code Online (Sandbox Code Playgroud)

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

为了加深您对此示例的理解(并练习良好习惯),请尝试为您的函数编写类型签名.咨询ghci :t寻求帮助.