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

如何使用attoparsec库实现字符的条件转换?

如何在attoparsec中安全实现satisfyMaybe函数

我使用attoparsec库编写了如下函数:

satisfyMaybe :: (Char -> Maybe a) -> Parser a
satisfyMaybe f =
  (fromJust . f) <$> satisfy (isJust . f)

该函数的作用是对下一个字符应用函数f,若返回Just x则返回x,否则解析失败。但我不想使用fromJust这类可能引发错误的不安全函数,请问有没有安全的实现方式?


安全实现方案

可以通过两种方式规避fromJust,同时保持代码的类型安全:

方式一:do块+模式匹配

import Data.Attoparsec.Text (Parser, satisfy)
import Control.Applicative (empty)
import Data.Maybe (isJust)

satisfyMaybe :: (Char -> Maybe a) -> Parser a
satisfyMaybe f = do
  c <- satisfy (isJust . f)
  case f c of
    Just x -> pure x
    Nothing -> empty

方式二:Applicative风格简化写法

import Data.Attoparsec.Text (Parser, satisfy)
import Control.Applicative (empty)
import Data.Maybe (isJust)

satisfyMaybe :: (Char -> Maybe a) -> Parser a
satisfyMaybe f = satisfy (isJust . f) >>= maybe empty pure . f

说明

两种实现都完全避免了不安全函数:satisfy (isJust . f)已经确保被匹配到的字符c一定会让f c返回Just值,因此代码里的empty分支永远不会被触发,但写法上保持了Haskell的类型严谨性,没有依赖任何不安全的操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 01:20:01