【发布时间】:2018-07-24 08:08:52
【问题描述】:
您能帮我处理Turtle 库吗? 我想编写一个简单的程序来计算磁盘空间使用情况。 代码如下:
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],我可以使用sequence 将IO monad 从那里拉出来,将其转换为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 可以从Shell (IO Size) 变成IO (Shell Size)?
谢谢。
【问题讨论】: