假设我们有一个文件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"]
答案 0 :(得分:3)
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"]