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

如何将字符范围解析为元组?Haskell解析器写法优化咨询

解决Haskell解析器简洁化的问题

其实标准库和常用解析库(比如Parsec)里确实没有直接提供「用指定分隔符连接两个解析器,返回二者结果元组」的现成运算符,但你完全可以自己定义一个,非常方便:

-- 定义一个带分隔符的组合运算符,优先级和Applicative运算符对齐
infixl 4 <:>
(<:>) :: Applicative f => f a -> f sep -> f b -> f (a, b)
a <:> sep <:> b = (,) <$> a <* sep <*> b

这样你的数字范围解析器就能写成非常简洁的形式:

numRange :: Parser (Char, Char)
numRange = digitChar <:> char '-' <:> digitChar

如果你只是觉得原写法里的<*和<*>有点繁琐,也可以直接对(,)做Applicative组合——这其实已经是Haskell里处理这类场景的标准写法了:

numRange :: Parser (Char, Char)
numRange = (,) <$> digitChar <* char '-' <*> digitChar

关于Hoogle搜索的问题:你之前搜的Applicative f => f a -> f b -> f (a, b)其实是存在对应实现的,比如liftM2 (,)或者(,) <$> a <*> b,但因为Hoogle的结果排序逻辑,可能没出现在靠前位置。而你真正需要的带分隔符的组合子签名是Applicative f => f a -> f s -> f b -> f (a,b),搜这个签名能找到更匹配的结果,但自定义一个显然更直接。

内容的提问来源于stack exchange,提问作者Good Night Nerd Pride

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:30:42