代码之家  ›  专栏  ›  技术社区  ›  Addem

Haskell:如何为解析器实现>>=

  •  0
  • Addem  · 技术社区  · 7 年前

    我有以下解析器

    newtype Parser a = P (String -> [(a,String)])
    

    我需要将bind作为Monad实现。我知道退货的定义是

    instance Monad Parser where
        return v = P (\inp -> [(v,inp)])
    

    p >>= f 我知道这么多: p 是解析器对象,f具有类型声明

    f :: a -> Parser b
    

    所以我在想 p>>=F 需要是封装函数的解析器对象。该函数的参数是一个字符串。所以我猜函数应该“打开” P ,获取其函数,将其应用于输入字符串,获取类型为[(a,string)]的对象,然后…我想可能会应用 f 到每个元组中的每个第一个坐标,然后使用结果解析器的函数并将其应用到第二个坐标。。。然后列出所有的元组?

    在这一点上,我对我是否做对了这件事,如果是的话,如何做,感到相当困惑。也许我应该用类型写一个helper函数

    trans :: [(a,String)] -> (a -> Parser b) -> [(b,String)]
    

    但在开始之前,我想检查一下我对自己应该做的事情的混乱描述是否属实。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Dannyu NDos AJF    7 年前
    instance Monad Parser where
        return v = P (\inp -> [(v,inp)])
        P p >>= f = P (\inp -> do
            (x,u) <- p inp
            let P q = f x
            q u
            )