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

Attoparsec多字符高效解析器优化:单字符转Text的高效实现

高效实现方案

你的判断没错,多次调用pack [c]再拼接确实会带来不必要的开销——每次不仅要创建单元素列表,还要初始化小型Text对象,后续mconcat还要反复合并这些小Text,效率很低。这里有两种更高效的实现思路:

1. 一次性打包所有字符(最优解)

直接先收集所有匹配到的字符为列表,最后只做一次pack转换,彻底避免多次小Text的创建和拼接:

anyCharParser :: Parser Text
anyCharParser = pack <$> manyTill anyChar endOfInput

这种方式把所有字符攒成一个列表后一次性转成Text,是效率最高的做法,因为pack处理连续字符序列的开销远低于多次零散转换。

2. 高效的单字符Text解析器

如果确实需要单独匹配单个字符并返回Text,可以用Data.Text提供的singleton函数代替pack [c]——singleton是专门为单字符场景优化的API,无需创建中间列表:

import Data.Text (singleton)

singleCharParser :: Parser Text
singleCharParser = singleton <$> anyChar

但注意,即使使用这个单字符解析器,如果你还是用manyTill配合mconcat,依然会有多次Text拼接的开销,所以第一种一次性打包的方案始终是首选。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:50:25