你能帮我看看海龟图书馆吗?我想编写一个简单的程序来计算磁盘空间使用情况。这是代码:
getFileSize :: FilePath -> IO Size
getFileSize f = do
status <- stat f
return $ fileSize status
main = sh $ do
let sizes = fmap getFileSize $ find (suffix ".hs") "."
所以现在我有sizes
绑定类型Shell (IO Size)
。但我不能用sum
折叠来总结它,因为那里IO Size
有。如果它是类似的东西,[IO Size]
我可以IO
通过使用将 monadsequence
转换为IO [Size]
. 但我不能用Shell
monad 做到这一点,因为它不是Traversable
. 所以我写了这样的东西
import qualified Control.Foldl as F
main = sh $ do
let sizes = fmap getFileSize $ find (suffix ".hs") "."
lst <- fold sizes F.list
let cont = sequence lst
sz <- liftIO $ cont
liftIO $ putStrLn (show (sum sz))
首先我折叠Shell (IO Size)
到[IO Size]
,然后再折叠到IO [Size]
总和列表。但我想知道是否有更规范或优雅的解决方案,因为在这里我创建了两个列表来完成我的任务。而且我认为Shell
monad 用于在恒定空间中操纵实体。也许有一些可以fold
做?IO (Shell Size)
Shell (IO Size)
谢谢。