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
。
我定义了一个解析器对象:
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
。