В этом блоке кода у меня есть функция tagsort, которая принимает FilePath и возвращает строку ввода-вывода.
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]
, но вместо того, чтобы сопоставить сортировку тегов в списке filedirs, вы получите [IO String]
. Я не совсем уверен, как это обойти или можно ли вообще обойти. Возможно, картографирование не является правильным способом сделать это? Любая помощь будет оценена.