V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eote
V2EX  ›  编程

求教等式为啥成立

  •  
  •   eote · 2022-05-26 14:22:04 +08:00 · 1312 次点击
    这是一个创建于 919 天前的主题,其中的信息可能已经有所发展或是发生改变。
    newtype Parser a = Parser (String -> [(a, String)])
    
    apply :: Parser a -> String -> [(a, String)]
    apply (Parser p) s = p s
    
    instance Monad Parser where 
     return x = Parser (\s -> [(x, s)])
     p >>= q  = Parser (\s -> [(y, s'') | (x, s') <- apply p s, (y, s'') <- apply (q x) s'])
    
    
    fail = Parser (\s -> [])
    
    guard :: Bool -> Parser ()
    guard True  = return ()
    guard False = fail
    
    
    sat :: (Char -> Bool) -> Parser Char
    sat p = do { c <- getc; guard (p c); return c }
    
    
    -- 以上是背景
    -- 以下是问题
    
    -- 为啥 guard (p c) >> return c = fail >> return c = fail
    -- p c == True 很好理解 guard (p c)结果被弃掉了
    -- p c == False 为啥没走到 return c
    
    3 条回复    2022-05-27 05:29:21 +08:00
    eote
        2
    eote  
    OP
       2022-05-26 15:20:16 +08:00
    @iamzuoxinyu url 说的是 pattern failure 吧
    leomayleomay
        3
    leomayleomay  
       2022-05-27 05:29:21 +08:00
    Prelude 里面的 guard 貌似需要 context 是 Alternative https://hackage.haskell.org/package/base-4.16.1.0/docs/Control-Monad.html#v:guard
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2598 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:04 · PVG 11:04 · LAX 19:04 · JFK 22:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.