You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:09:54