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

Haskell如何筛选字符串列表中以指定前缀开头的元素?

问题修正与实现

你现有代码有三个核心问题:

  • 匹配函数选错:你需要的是前缀匹配,isInfixOf是判断子串是否出现在字符串任意位置,比如isInfixOf "Ex" "aExb"也会返回True,不符合前缀匹配的要求,应该用Data.List提供的isPrefixOf,专门用于前缀校验。
  • 函数参数顺序写反:isPrefixOf和isInfixOf的参数顺序都是待查找子串 -> 被查找的完整字符串 -> Bool,你写的isInfixOf x std是在判断「列表里的完整字符串是不是你传入的前缀的子串」,逻辑完全颠倒。
  • 递归分支语法不完整:守卫(|)后面需要跟完整的条件判断和=连接的返回值,列表递归的逻辑是逐个处理元素,符合条件就保留,不符合就跳过。

正确递归实现

-- 导入需要的前缀匹配函数
import Data.List (isPrefixOf)

helper :: [String] -> String -> [String]
-- 递归基准:空列表直接返回空
helper [] _ = []
-- 拆分列表为头元素x和剩余尾部xs
helper (x:xs) prefix
  -- 当前字符串以prefix为前缀:把x拼到剩余列表处理结果的头部
  | isPrefixOf prefix x = x : helper xs prefix
  -- 不匹配:直接跳过x,处理剩余列表
  | otherwise = helper xs prefix

效果验证

传入你给出的测试用例:

helper ["Excuse","Me", "Exit", "And"] "Ex"

运行返回结果:

["Excuse","Exit"]

完全符合预期。

注意:如果你硬要用isInfixOf实现前缀匹配,需要额外判断子串匹配的起始索引为0,完全没必要,直接用isPrefixOf是最简洁正确的方案。

内容的提问来源于stack exchange,提问作者FrankZZZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:09:19