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") "."