HappStack中的Haskell Monads msum

| 从 http://happstack.com/docs/crashcourse/HappstackState.html 当我运行服务器时,窥视计数器增加了 1当我偷看 2当我不偷看 有问题的相关代码是:
handlers :: ServerPart Response
handlers = 
    msum [ dir \"peek\" $ do c <- query PeekCounter
                       ok $ toResponse $ \"peeked at the count and saw: \" ++ show (unCounter c)
         , do c <- update (AddCounter 1)
           ok $ toResponse $ \"New count is: \" ++ show (unCounter c)
         ]
但是,当我将其修改为
handlers :: ServerPart Response
handlers = 
    msum [ dir \"peek\" $ do c <- query PeekCounter
                           ok $ toResponse $ \"peeked at the count and saw: \" ++ show (unCounter c)
         , do ok $ toResponse $ \"Stop here.\"
         , do c <- update (AddCounter 1)
              ok $ toResponse $ \"New count is: \" ++ show (unCounter c)
         ]
计数器增加 我偷看时为0 1当我不偷看时 那是预期的行为吗?即使我偷看,感觉好像msum中的第二个monad是“泄漏”。     
已邀请:
由于每次浏览器加载页面时浏览器都会请求/favicon.ico,因此该计数将增加额外的时间。由于最后一条路线是万能的,因此对/favicon.ico的请求将导致增量。 最简单的解决方法是添加nullDir,使其仅对/递增
handlers :: ServerPart Response
handlers = 
msum [ dir \"peek\" $ do c <- query PeekCounter
                   ok $ toResponse $ \"peeked at the count and saw: \" ++ show (unCounter c)
     , do nullDir
          c <- update (AddCounter 1)
          ok $ toResponse $ \"New count is: \" ++ show (unCounter c)
     ]
为了避免进一步的混乱,我已经对该教程进行了更新。为了确认确实是/favicon.ico请求使事情变得混乱,我们可以显式处理对favicon的请求:
handlers :: ServerPart Response
handlers = 
    msum [ dir \"peek\" $ do c <- query PeekCounter
                           ok $ toResponse $ \"peeked at the count and saw: \" ++ show (unCounter c)
         , dir \"favicon.ico\" $ notFound (toResponse \"sorry, no favicon.ico\")
         , do c <- update (AddCounter 1)
              ok $ toResponse $ \"New count is: \" ++ show (unCounter c)
         ]
现在我们看到了预期的行为。 总而言之,Happstack没有任何问题。浏览器向非/ peek的网址发出1或2个请求,因此计数增加了一两次。那是应用程序的预期行为。但是,由于人们并不期望/favicon.ico请求,因此也会导致令人惊讶的行为。因此,现在该应用程序已更改为仅具有两个有效的URL / peek和/。其他任何情况都将产生404。 感谢您的举报!     

要回复问题请先登录注册