我正在迭代[Char]列表,我想知道执行迭代的最佳方法 .
此函数以递归方式调用自身,并将每次迭代减少的计数器传回给自身 .
它仅用于说明目的,因此每个Char都要返回True:
text = ["abcsdsdsdsd"]
exampleFunction :: Int -> String -> [Bool]
exampleFunction textlen text
| textlen >= 0 = True : exampleFunction (textlen - 1) text
| otherwise = []
使用'textlen'作为计数器似乎相当必要,这是最好的方式和/或最像Haskell一样的实现吗?
1 回答
柜台不是特别重要;您只需使用它来确定列表是否为非空(
textlen >= 0
) . 你可以通过参数本身的模式匹配来做同样的事情 .正如评论中所指出的,这个特定的递归方案被抽象为
map
函数:其中
const True
返回一个返回True
的函数,无论它的参数是什么 . (const True
也可以写为显式lambda表达式(\_ -> True
) .map
将此函数应用于xs
的每个元素,并将结果合并到一个新列表中 .其他递归方案捕获不同的递归样式(
filter
,foldr
等),因此尽管总是可以编写显式递归函数来完成任务,但您通常可以通过使用适当的高阶函数来避免它 .我有点滥用术语递归方案;
map
和filter
可以被认为是foldr
的特例,这是一个称为catamorphism的一般递归方案的例子 .