【发布时间】:2019-05-03 00:08:11
【问题描述】:
在这里的这段代码中,我有一个函数 tagsort,它接受一个 FilePath 并返回一个 IO 字符串。
builddir xs = do
writeto <- lastest getArgs
let folderl b = searchable <$> (getPermissions b)
let filel c = ((lastlookup mlookup c) &&) <$> ((not <$> folderl c))
a <- listDirectory xs
listdirs <- filterM (folderl) (map ((xs ++ "/") ++) a)
filedirs <- filterM (filel) (map ((xs ++ "/") ++) a)
tagfiles <- tagsort <$> filedirs
--testprint to terminal
putStrLn $ concat listdirs
putStrLn $ concat tagfiles
tagsort :: Control.Monad.IO.Class.MonadIO m => FilePath -> m [Char]
tagsort xs = do
nsartist <- getTags xs artistGetter
nsalbum <- getTags xs albumGetter
let artist = init $ drop 8 $ show nsartist
let album = init $ drop 7 $ show nsalbum
pure (artist ++ " - " ++ album)
我想使用这个函数并将它映射到一个目录列表上。运行时出现此错误。
• Couldn't match type ‘[]’ with ‘IO’
Expected type: IO (t0 [Char])
Actual type: [t0 [Char]]
• In a stmt of a 'do' block: tagfiles <- tagsort <$> filedirs
我相信我明白这里发生了什么。为了以我希望的方式绑定到标记文件,我想要一个IO [String],但是将标记排序映射到文件目录列表会产生[IO String]。我不完全确定如何规避这一点,或者它是否甚至可以被规避。也许映射不是正确的方法?任何帮助将不胜感激。
【问题讨论】:
-
听起来你需要sequence。或者只使用
mapM而不是fmap/<$> -
我发誓我尝试了 mapM,它给出了与 map 相同的错误,但我错了。我觉得很傻。
-
您能否将它现在有效的信息添加到问题中或回答您自己的问题或接受已发布的答案,而不是仅仅说您在 cmets 中解决了它