如何使用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
相关产品推荐
相关产品推荐

