Я практикую Haskell, пытаясь создать программу, которая находит метаданные .mp3 и .flac и аккуратно записывает их в файл.Я зашел так далеко, но я довольно озадачен тем, что мне следует делать.Вот основной кусок кода здесь:
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)
let tagfiles = mapM (tagsort) filedirs
putStrLn $ concat listdirs
putStrLn $ concat tagfiles
tagsort xs = do
nsartist <- getTags xs artistGetter
nsalbum <- getTags xs albumGetter
artist <- init $ drop 8 $ show nsalbum
album <- init $ drop 7 $ show nsalbum
(artist ++ " - " ++ album)
Я знаю, это очень грязно.Когда я запускаю ghci, я получаю следующее:
• Couldn't match expected type ‘[Char]’ with actual type ‘Char’
• In the first argument of ‘(++)’, namely ‘artist’
In a stmt of a 'do' block: artist ++ " - " ++ album
In the expression:
do nsartist <- getTags xs artistGetter
nsalbum <- getTags xs albumGetter
artist <- init $ drop 8 $ show nsalbum
album <- init $ drop 7 $ show nsalbum
....
60 artist ++ " - " ++ album
Мне трудно понять, почему это происходит.Выполнение аналогичной команды в моей тестовой программе:
main = do
artg <- getTags "/home/spilskinanke/backlogtest/02 - await rescue.mp3" artistGetter
let test = init $ drop 8 $ show artg
print test
, это работает точно.Выводит строку «65daysofstatic» на мой терминал в ghci.Это явно не тип Char.Так почему в моем коде его называют Чаром?Также обратите внимание, что перед добавлением любых фрагментов кода, которые ссылаются на модуль метаданных, который я использую (htaglib), эта программа работала нормально в тесте.При отсутствии функции tagfiles и монады tagort я смог установить arg для определенного каталога, и мой тест успешно распечатал список FilePaths, содержащий все читаемые папки, и другой список FilePaths, содержащий все файлы, заканчивающиеся тем, что я хотел вmlookup, в данном случае это .mp3, .mp4, .flac и .wav.Любая помощь будет оценена.