Haskell:你如何找出< *>的定义?从Monad的定义?

时间:2016-12-18 04:49:07

标签: parsing haskell applicative

我定义了一个解析器对象:

java

生成它们的功能:

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

这个解析器对象的Monad实例允许我将多个解析器绑定到一个:

produce :: a -> Parser a
produce x = Parser (\ts -> [(ts, x)])

我也一直在使用< *>非常高兴地将不同类型的多个解析器链接起来,以解析其中包含不同部分的字符串。

当然< *>通过以下方式定义:

instance Monad Parser where
  return = produce
  Parser px >>= f = Parser (\ts ->
   concat([parse (f x) ts' | (ts', x) <- px ts]))

但我想明确地定义它,以便我能够理解并解释它是如何工作的,我一直无法弄明白。

那么如何弄清楚如何明确地找到ap或&lt; *&gt;的定义?在这种情况下?

关于什么&lt; *&gt;的任何建议将是或将如何解决它是值得赞赏的。

感谢。

1 个答案:

答案 0 :(得分:2)

你可以从

开始
f <*> x = do
    f' <- f
    x' <- x
    return (f' x')

或等同于

f <*> x =
    f     >>= (\f' ->
    x     >>= (\x' ->
    return (f' x')))

然后根据需要展开{​​{1}}和>>=