我无法理解以下Applicative实例。有人能解释一下Applicative做什么(在这种情况下)以及如何使用它?或者写一点混淆?谢谢!
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)
答案 0 :(得分:4)
也许以下等效代码可以更清楚地说明发生了什么?
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
答案 1 :(得分:1)
将两个解析器与<*>
组合在一起会为您提供新的解析器。给定一个输入字符串,新的解析器运行第一个解析器返回结果和未解析的字符串剩余部分。字符串的其余部分将提供给第二个解析器,返回结果和未解析的余数。然后结合两个结果。如果任一解析器失败,则结果失败。