龟:如何读取文件列表?

时间:2017-10-05 15:29:01

标签: haskell haskell-turtle

假设我们有一个文件my_file.txt,内容为:

foo
bar

和另一个文件my_other_file.txt包含:

baz

我想使用turtle阅读这两个文件的内容,以便获得Shell行,这将产生:

foo
bar
baz

在Haskell的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

编辑:使用asum也可以实现上述效果:

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

1 个答案:

答案 0 :(得分:3)

LineMonoid个实例。如果我们有Line的列表,我们可以mconcat将它们合并为一个:

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

由于ShellApplicative个实例,我们可以使用traverse在文件列表中使用input

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

我们最终获得Shell [Line]。由于ShellFunctor,我们可以fmap mconcat(或fold如果您不使用列表):

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