Черепаха: как прочитать список файлов?

Предположим, у нас есть файл my_file.txt с содержанием:

foo
bar

и другой файл my_other_file.txt содержащий:

baz

Я хотел бы прочитать содержимое этих двух файлов, используя turtle так что я получаю Shell из линий, которые будут производить:

foo
bar
baz

В Хаскелле turtle Библиотека можно прочитать список файлов с помощью input, например:

view $ input "my_file.txt"

У нас есть это

input :: FilePath -> Shell Line

А также Shell не имеет Monoid случаи (которые я думаю, имеет смысл, так как мы не можем связать IO операции), поэтому единственный оператор, который я могу использовать, это (<|>):

view $ foldl (<|>) empty $ map input ["my_file.txt", "my_other_file.txt"]

Хотя это дает желаемый эффект, мне интересно, есть ли библиотека в turtle эко-система, которая заботится об этом, или есть ли traverse как операция, которую можно использовать на Alternative "S.

РЕДАКТИРОВАТЬ: вышеупомянутый эффект также может быть достигнут с помощью asum:

asum $ input <$> ["my_file.txt", "my_other_file.txt"]

1 ответ

Решение

Line имеет Monoid пример. Если у нас есть список Line с, мы можем mconcat их в один:

do
  exampleA <- input "my_file.txt"
  exampleB <- input "my_other_file.txt"
  return $ mconcat [exampleA, exampleB]

поскольку Shell имеет Applicative Например, мы можем использовать traverse использовать input по списку файлов:

traverse input ["my_file.txt","my_other_file.txt"]

Мы заканчиваем с Shell [Line], поскольку Shell это Functor, мы можем fmapmconcat (или же fold если вы не используете список):

mconcat <$> traverse input ["my_file.txt","my_other_file.txt"]
Другие вопросы по тегам