如何将字符范围解析为元组?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
相关产品推荐
相关产品推荐

