Черепаха: как прочитать список файлов?
Предположим, у нас есть файл 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
, мы можем fmap
mconcat
(или же fold
если вы не используете список):
mconcat <$> traverse input ["my_file.txt","my_other_file.txt"]