Haskell 哈斯凯尔海龟走出贝壳单子

Haskell 哈斯凯尔海龟走出贝壳单子,haskell,haskell-turtle,Haskell,Haskell Turtle,你能帮我弄一下图书馆吗。 我想写一个简单的程序,计算磁盘空间使用率。 代码如下: getFileSize :: FilePath -> IO Size getFileSize f = do status <- stat f return $ fileSize status main = sh $ do let sizes = fmap getFileSize $ find (suffix ".hs") "." 首先,我将Shell(IO大小)折叠到[IO大小],然后折

你能帮我弄一下图书馆吗。 我想写一个简单的程序,计算磁盘空间使用率。 代码如下:

getFileSize :: FilePath -> IO Size
getFileSize f = do
  status <- stat f
  return $ fileSize status

main = sh $ do
  let sizes = fmap getFileSize $ find (suffix ".hs") "."
首先,我将
Shell(IO大小)
折叠到
[IO大小]
,然后折叠到
IO[Size]
以对列表进行求和。 但我想知道是否有更规范或优雅的解决方案,因为我在这里创建了两个列表来完成我的任务。我认为,
Shell
monad用于在常量空间中操作实体。也许有一些
折叠
可以从
外壳(IO大小)
制作
IO(外壳大小)


谢谢。

实际上,我已经通过使用助手转换成功地摆脱了这里的
IO

sio :: Shell (IO a) -> Shell a
sio s = Shell (\(FoldShell step begin done) ->
                let step' x a = do
                      a' <- a
                      step x a'
                in
                  _foldShell s (FoldShell step' begin done))
sio::Shell(IO a)->Shell a
sio s=外壳(\(折叠外壳步骤开始-完成)->
让步骤'xa=do

一个“你有一个
IO
操作,你真的想要一个
Shell
操作。通常的处理方法是使用
liftIO
方法,这是可用的,因为
Shell
MonadIO
的一个实例

file <- find (suffix ".hs") "."
size <- liftIO $ getFileSize file

文件谢谢,对于如此简单的解决方案,我应该猜测一下自己。这是因为我用
fmap
困住了自己,在这里应该使用更直接的方法。
file <- find (suffix ".hs") "."
size <- liftIO $ getFileSize file
size <- liftIO . getFileSize =<< find (suffix ".hs") "."