我定义了一个解析器对象:
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;的任何建议将是或将如何解决它是值得赞赏的。
感谢。
答案 0 :(得分:2)
你可以从
开始f <*> x = do
f' <- f
x' <- x
return (f' x')
或等同于
f <*> x =
f >>= (\f' ->
x >>= (\x' ->
return (f' x')))
然后根据需要展开{{1}}和>>=
。