首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell应用实例澄清

Haskell应用实例澄清
EN

Stack Overflow用户
提问于 2014-11-10 10:56:51
回答 2查看 109关注 0票数 3

我很难理解下面的应用实例。有人能解释一下应用程序做了什么(在这种情况下)以及如何使用它吗?或者写得不那么模糊?谢谢!

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-10 11:12:25

也许下面的等价代码更清楚地说明了发生了什么?

代码语言:javascript
复制
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
票数 4
EN

Stack Overflow用户

发布于 2014-11-10 11:04:38

将两个解析器与<*>组合在一起将为您提供新的解析器。给定一个输入字符串,新解析器运行第一个解析器返回结果和未解析的字符串剩余部分。将字符串的剩余部分分配给返回结果和未解析余数的第二个解析器。然后将这两种结果结合起来。如果任何一个解析器失败,结果就是失败。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26842177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档