3

假设我们有一个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's 上使用。

编辑:上面的效果也可以通过使用来实现asum

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

1 回答 1

3

Line有一个Monoid实例。如果我们有一个Lines 列表,我们可以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]. 由于Shellis a Functor,我们可以fmap mconcat(或者fold如果您不使用列表):

mconcat <$> traverse input ["my_file.txt","my_other_file.txt"]
于 2017-10-05T16:45:06.417 回答