2015-12-20 6 views
1

Я новичок в Haskell.copyFile из двух списков в Haskell

Моя цель - скопировать файлы из одного каталога в другой каталог.

Пока что у меня есть:

У меня есть два списка содержат имена файлов полного пути

list1 = ["file1", "file2" ...] 
list2 = ["new name1", "new name2"...] 

Я хочу использовать

copyFile::FilePath->FilePath->IO() 

копировать файлы из list1 в list2

Примечание: list2 содержит все новые имена файлов полного пути

Я знаю

zipWith(a->b->c)->[a]->[b]->[c] 

и я стараюсь

zipWith(copyFile) list1 list2 

, но он не работает.

Любое предложение будет оценено

ответ

0

copyFile является монадическая действие, так что вы не можете использовать zipWith на нем, вот что вы можете сделать:

mapM_ (uncurry copyFile) $ zip list1 list2 

примечание mapM_ «s подпись типа:

λ> :t mapM_ 
mapM_ :: Monad m => (a -> m b) -> [a] -> m() 
+0

прекрасное решение – elliptic00

6

С

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] 

и

System.Directory.copyFile :: FilePath -> FilePath -> IO() 

если вы zip с copyFile, вы получите:

zipWith copyFile :: [FilePath] -> [FilePath] -> [IO()] 

, что, учитывая два списка путей к файлам, вы получите список действий, в которых каждый копирует действие по файл. Вы можете оценить такой список действий, используя sequence_:

sequence_ :: (Foldable t, Monad m) => t (m a) -> m() 

(в данном случае, sequence_ :: [IO()] -> IO()).

Таким образом, что-то вроде

sequence_ (zipWith copyFile ["foo", "bar"] ["new_foo", "new_bar"]) 

будет работать для вас.

EDIT: Еще лучше, как предложил Дэниел Вагнер, используйте Control.Monad.zipWithM_ (zipWithM_ copyFile [...] [...]).

+0

Хорошее предложение! – elliptic00

+3

'Control.Monad' также предлагает' zipWithM' и 'zipWithM_'. –

Смежные вопросы