В настоящее время я пытаюсь выяснить, как перечислить архив TAR (gzipped) в Haskell. Codec.Archive.Tar
кажется правильным выбором для задачи, но я не могу понять, как map
entryPath
над Entries
моноидом.Список TAR-архивов в Haskell
Предположим, что TAR содержит записи (только файлы) a.txt, b.txt, c.txt
и имеет имя foo.tar.gz
. Вот мой код, чтобы прочитать файл:
import qualified Codec.Archive.Tar as Tar
import qualified Data.ByteString.Lazy as BS
import qualified Codec.Compression.GZip as GZip
foldEntryToPath :: Tar.Entry -> [String] -> [String]
foldEntryToPath entry list = list ++ [show $ Tar.entryPath entry]
-- Converts TAR errors to a string.
entryFailMapper :: String -> [String]
entryFailMapper err = [err]
main = do
fileContent <- fmap GZip.decompress $ BS.readFile "foo.tar.gz"
entries <- fmap Tar.read fileContent :: Tar.Entries
-- Here I don't know how to correctly apply fmap
entryPaths <- Tar.foldEntries foldEntryToPath [] entryFailMapper entries :: [String]
-- This should print ["a.txt", "b.txt", "c.txt"]
print entryPaths
Вот ошибка печатается runghc
:
readtar.hs:14:49:
Expecting one more argument to `Tar.Entries'
In an expression type signature: Tar.Entries
In a stmt of a 'do' block:
entries <- fmap Tar.read fileContent :: Tar.Entries
In the expression:
do { fileContent <- fmap GZip.decompress
$ BS.readFile "foo.tar.gz";
entries <- fmap Tar.read fileContent :: Tar.Entries;
entryPaths <- Tar.foldEntries
foldEntryToPath [] (\ x -> [...]) entries ::
[String];
print entryPaths }
До сих пор у меня мало знаний о Haskell, но, прочитав the docs я не знаю, почему Tar.Entries
является typeclass (это правильный термин, когда он говорит expecting n more arguments to <type>
?) или какой правильный тип использовать.
Любая помощь будет оценена!
к сведению, что это не последняя версия Lib. – Vektorweg
@Vektorweg Спасибо, я не заметил, что (я обновил ссылки!). Однако это было просто ссылки doc (нашли их с помощью Google в первую очередь), я установил lib, используя 'cabal install tar', который фактически установил 0.4.0.1 –