乌龟:如何读取文件列表?

Turtle: how to read a list of files?

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

foo
bar

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

baz

我想使用 turtle so that I get a 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"]

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]。由于 ShellFunctor,我们可以 fmap mconcat(如果不使用列表,则 fold):

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