我想查看我的当前目录,并且只打印.zip文件。
我的策略(如下所示)是将FilePaths作为一个IO [FilePath]。我想我可以提升IO,这样就可以对字符串元素进行过滤。
我的想法有什么问题?我想知道在IO [FilePath]上使用IO [FilePath]而不是IO FilePath是否有问题。
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发布于 2015-05-08 16:37:15
您不能从IO中提取任何内容,但是可以调整其他函数来处理IO值。
listCompressedImages folder =
filter (match (compile ".zip")) `fmap` getDirectoryContents folder上面的fmap将一个纯函数(如filter ...)应用于某些IO值。请注意,生成的类型仍然是IO --同样,您永远无法转义IO monad。
发布于 2015-05-08 16:16:28
您不想在这里使用liftIO,这是为了将IO操作提升到更复杂的单变量,而不是从IO操作中提取值。简而言之,您不能将IO a转换为a。IO的全部目的是阻止您这样做。不过,您可以使用a符号直接使用do值:
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的解释。
https://stackoverflow.com/questions/30128299
复制相似问题