Haskell中基于concat与map实现filter的代码疑问解析
关于Haskell
filter1 实现的拆解与确认 嘿,你的理解完全正确!让我一步步给你拆解这个实现,把细节讲明白:
首先先把代码格式化方便阅读:
filter1 :: (a -> Bool) -> [a] -> [a] filter1 p = concat . map box where box x | p x = [x] | otherwise = []
核心逻辑拆解
map box的作用:没错,map会遍历输入列表的每一个元素,把box函数逐个应用上去。对于每个元素x:- 如果满足判断条件
p x,box x就返回只包含x的单元素列表[x]; - 如果不满足条件,就返回空列表
[]。
举个例子:假设输入列表是[1,2,3,4],p是判断偶数的函数,那map box处理后会得到[[], [2], [], [4]]。
- 如果满足判断条件
concat的工作方式:concat是用来把“列表的列表”压平成一个普通列表的函数。它不是一次性合并所有子列表,而是遵循Haskell的惰性求值特性,从左到右逐个处理子列表:遇到空列表就直接跳过,遇到非空列表就把里面的元素依次放入结果中。还是上面的例子,concat [[], [2], [], [4]]会跳过两个空列表,最终得到[2,4],完美实现了过滤的效果。
一句话总结
这个实现的本质就是:把符合条件的元素“打包”成单元素列表,不符合的打包成空列表,再通过 concat 把这些列表串起来——空列表会被自然忽略,最终就得到了所有满足条件的元素,和标准库的 filter 函数功能完全一致。
内容的提问来源于stack exchange,提问作者Marcos Ayala
相关产品推荐
相关产品推荐

