【问题标题】:how to transform a IO [FilePath] into a [FilePath]? [duplicate]如何将 IO [FilePath] 转换为 [FilePath]? [复制]
【发布时间】:2015-05-08 16:09:30
【问题描述】:

我想查看当前目录并仅打印 .zip 文件。

我的策略(如下所示)是将 FilePaths 设为IO [FilePath]。我想我可以解除 IO 以便可以过滤字符串元素。

我的想法有什么问题?我想知道我在IO [FilePath] 上使用liftIO 而不是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

【问题讨论】:

  • 从不,从不,从不使用liftIO!如果您使用liftIO,那么您正在练习糟糕的Haskell。我知道你是新人,但你需要学习!
  • @AJFarmar 这到底是怎么回事? liftIO 非常有用,当然也不是糟糕的 Haskell。它在这里不一定有用,但您不惜一切代价避免它的建议似乎偏离了目标。
  • 我找不到规范的IO a -> a 问题;但我找到了一个非常接近的。如果你能找到更好的,请联系我。
  • @daniel wagner。我同意另一个问题提供了适用于我的答案 - 我应该删除我的问题吗?
  • @hotGopher 我认为没有理由删除它。标记为重复就足够了(这已经完成了)。

标签: haskell monads


【解决方案1】:

您不想在这里使用liftIO,这是为了将IO 动作提升到更复杂的monad,而不是从IO 动作中提取值。总之,你不能把IO a 变成aIO 的全部意义在于防止你这样做。不过,您可以使用 do 表示法直接使用 a 值:

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 表示法并使用 &lt;- 提取它。更深入的解释我会推迟到Learn You a Haskell

【讨论】:

  • 谢谢。我想我有时需要把它放在茶匙里。逻辑是过滤器对内容中的每个元素应用函数匹配(带有模式),对吧?当我将 t.zip 文件添加到我的文件夹时,这仍然返回一个空列表..
  • 我发现我需要使用(编译“*.zip”)(通配符)。
【解决方案2】:

您无法从IO 中提取任何内容,但您可以调整其他函数以处理IO

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

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

【讨论】:

    猜你喜欢
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多