Parsing 哈斯克尔:你是如何定义<*&燃气轮机;从一元定义?

Parsing 哈斯克尔:你是如何定义<*&燃气轮机;从一元定义?,parsing,haskell,applicative,Parsing,Haskell,Applicative,我定义了一个解析器对象: 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 >&g

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

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]))
实例Monad解析器,其中
返回=生产
解析器px>>=f=解析器(\ts->
concat([parse(fx)ts'|(ts',x)您可以从

f <*> x = do
    f' <- f
    x' <- x
    return (f' x')
fx=do
f'
x>>=(\x'->
返回(f'x'))
然后根据需要展开
>=
返回

您可以从

f <*> x = do
    f' <- f
    x' <- x
    return (f' x')
fx=do
f'
x>>=(\x'->
返回(f'x'))

然后根据需要展开
>=
return

您可以在这里找到
ap
的源代码:(尽管自己做这项练习很有趣。)用上面发布的实现中出现的
return
>=
替换为它们的右侧(就像在代数课上一样)你可以在这里找到
ap
的源代码:(尽管自己动手做很有趣)。用你上面发布的实现中出现的
return
>=
替换它们的右边(就像在代数课上一样)
f <*> x =
    f     >>= (\f' ->
    x     >>= (\x' ->
    return (f' x')))