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')))