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

Haskell: How do you figure out the definition of <*> from a Monad definition?

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

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

以及生成它们的函数:

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

以及此解析器对象的 Monad 实例,允许我将多个解析器绑定为一个:

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

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

当然 <*> 是通过以下定义的:

(<*>) = ap

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

那么在这种情况下,我怎样才能弄清楚如何明确找到 ap 或 <*> 的定义?

如有任何关于 <*> 是什么或我应该如何解决的建议,我们将不胜感激。

谢谢。

您可以从

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

或者,等价地

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

然后根据需要展开 >>=return