分享
三行代码  ›  专栏  ›  技术社区  ›  Gil Shafriri

解析器函子

  •  0
  • Gil Shafriri  · 技术社区  · 7 月前

    作为家庭作业的一部分,我们正在Haskell中开发一个解析器。我们有这个数据类型

    newtype Parser a = Parser { parse :: String -> Maybe (a,String) } 
    

    但接下来我们有了函子的定义:

      instance Functor Parser where
           fmap f p = Parser $ \s -> (\(a,c) -> (f a, c)) <$> parse p s
    

    我完全迷路了。在我看来 解析p s

    希望有人能给我一个线索。

    谢谢!

    1 回复  |  直到 7 月前
        1
  •  1
  •   bradrn    7 月前

    给定一个分析器 p , fmap fn p 第页 但随后适用 fn parseOptionalNumber :: Parser (Maybe Int) ,你可以把它变成 parseNumber :: Parser Int 通过做 parseNumber = fmap fromJust parseOptionalNumber fromJust 是部分的)。

    • 整件事都被包裹着 Parser $ \s -> … ,它创建一个新的解析器,该解析器执行 … 给定输入字符串 s .
    • parse p s 使用函数 parse :: Parser a -> (String -> Maybe (a,String)) (根据 Parser a )运行输入分析器 在输入字符串上 s公司 Maybe (a,String) .
    • (<$>) 是函数的同义词 fmap ,但作为运算符而不是函数。它将函数映射到 可能(a,字符串) \(a,c) -> (f a, c) ,它运行给定的函数 f 超过产量 (a,c) 从给定的解析器 .

    希望这是有意义的;如果没有,你可能会发现重写更有用 fmap 以不太紧凑的形式:

    instance Functor Parser where
        fmap f inParser = Parser $ \inputStr ->
            case (parse inParser inputStr) of
                Nothing -> Nothing
                Just (result, leftoverString) -> Just (f result, leftoverString)