我很难理解下面的应用实例。有人能解释一下应用程序做了什么(在这种情况下)以及如何使用它吗?或者写得不那么模糊?谢谢!
newtype Parser a = P { getParser :: String -> Maybe (a, String) }
instance Applicative Parser where
pure = success
P p <*> P p' = P $ \s -> case p s of
Just (f, s') -> fmap (applyToFirst f) $ p' s'
Nothing -> Nothing
{-|
Applies a function to the first component of a pair.
-}
applyToFirst :: (a -> b) -> (a, c) -> (b, c)
applyToFirst f (x, y) = (f x, y)发布于 2014-11-10 11:12:25
也许下面的等价代码更清楚地说明了发生了什么?
instance Applicative Parser where
pure v = P (\s -> Just (v, s))
P p <*> P p' = P $ \s -> case p s of
Just (f, s') -> case p' s' of
Just (v, s'') -> Just (f v, s'')
Nothing -> Nothing
Nothing -> Nothing发布于 2014-11-10 11:04:38
将两个解析器与<*>组合在一起将为您提供新的解析器。给定一个输入字符串,新解析器运行第一个解析器返回结果和未解析的字符串剩余部分。将字符串的剩余部分分配给返回结果和未解析余数的第二个解析器。然后将这两种结果结合起来。如果任何一个解析器失败,结果就是失败。
https://stackoverflow.com/questions/26842177
复制相似问题