首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将IO [FilePath]转换为[FilePath]?

如何将IO [FilePath]转换为[FilePath]?
EN

Stack Overflow用户
提问于 2015-05-08 16:09:30
回答 2查看 639关注 0票数 0

我想查看我的当前目录,并且只打印.zip文件。

我的策略(如下所示)是将FilePaths作为一个IO [FilePath]。我想我可以提升IO,这样就可以对字符串元素进行过滤。

我的想法有什么问题?我想知道在IO [FilePath]上使用IO [FilePath]而不是IO FilePath是否有问题。

代码语言:javascript
复制
import System.Directory 
import System.FilePath.Glob
import Control.Monad.IO.Class

main :: IO()

listCompressedImages folder = 
  filter (match (compile ".zip")) (liftIO (getDirectoryContents folder))

main = listCompressedImages "." >>= print
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-08 16:37:15

您不能从IO中提取任何内容,但是可以调整其他函数来处理IO值。

代码语言:javascript
复制
listCompressedImages folder = 
   filter (match (compile ".zip")) `fmap` getDirectoryContents folder

上面的fmap将一个纯函数(如filter ...)应用于某些IO值。请注意,生成的类型仍然是IO --同样,您永远无法转义IO monad。

票数 3
EN

Stack Overflow用户

发布于 2015-05-08 16:16:28

您不想在这里使用liftIO,这是为了将IO操作提升到更复杂的单变量,而不是从IO操作中提取值。简而言之,您不能将IO a转换为aIO的全部目的是阻止您这样做。不过,您可以使用a符号直接使用do值:

代码语言:javascript
复制
listCompressedImages :: FilePath -> IO [FilePath]
listCompressedImages folder = do
    -- getDirectoryContents :: FilePath -> IO [FilePath]
    -- contents :: [FilePath]
    contents <- getDirectoryContents folder
    -- filter (match (compile ".zip")) :: [FilePath] -> [FilePath]
    return $ filter (match (compile ".zip")) contents

main :: IO ()
main = do
    -- compressedImages :: [FilePath]
    compresssedImages <- listCompressedImages "."
    print compressedImages

当您有IO a类型的东西,并且想从它中获取a类型的值时,使用do符号并使用<-提取它。关于更深入的解释,我将听Learn You a Haskell的解释。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30128299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档