乌龟:如何读取文件列表?
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]
。由于 Shell
是 Functor
,我们可以 fmap
mconcat
(如果不使用列表,则 fold
):
mconcat <$> traverse input ["my_file.txt","my_other_file.txt"]
假设我们有一个文件 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]
。由于 Shell
是 Functor
,我们可以 fmap
mconcat
(如果不使用列表,则 fold
):
mconcat <$> traverse input ["my_file.txt","my_other_file.txt"]