首页 文章

在函数式编程中使用计数器进行迭代?

提问于
浏览
0

我正在迭代[Char]列表,我想知道执行迭代的最佳方法 .

此函数以递归方式调用自身,并将每次迭代减少的计数器传回给自身 .

它仅用于说明目的,因此每个Char都要返回True:

text = ["abcsdsdsdsd"]

exampleFunction :: Int -> String -> [Bool]
exampleFunction textlen text
  | textlen >= 0        = True : exampleFunction (textlen - 1) text
  | otherwise   = []

使用'textlen'作为计数器似乎相当必要,这是最好的方式和/或最像Haskell一样的实现吗?

1 回答

  • 2

    柜台不是特别重要;您只需使用它来确定列表是否为非空( textlen >= 0 ) . 你可以通过参数本身的模式匹配来做同样的事情 .

    exampleFunction :: [String] -> [Bool]
    exampleFunction (x:xs) = True : exampleFunction xs
    exampleFunction []  = []
    

    正如评论中所指出的,这个特定的递归方案被抽象为 map 函数:

    exampleFunction :: [String] -> [Bool]
    exampleFunction xs = map (const True) xs
    

    其中 const True 返回一个返回 True 的函数,无论它的参数是什么 . ( const True 也可以写为显式lambda表达式( \_ -> True ) . map 将此函数应用于 xs 的每个元素,并将结果合并到一个新列表中 .

    其他递归方案捕获不同的递归样式( filterfoldr 等),因此尽管总是可以编写显式递归函数来完成任务,但您通常可以通过使用适当的高阶函数来避免它 .


    我有点滥用术语递归方案; mapfilter 可以被认为是 foldr 的特例,这是一个称为catamorphism的一般递归方案的例子 .

相关问题