gpt4 book ai didi

haskell - 海龟 : how to read a list of files?

转载 作者:行者123 更新时间:2023-12-02 19:41:17 26 4
gpt4 key购买 nike

假设我们有一个文件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"]

最佳答案

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"]

关于haskell - 海龟 : how to read a list of files?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46589445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com