gpt4 book ai didi

haskell - 避免在 Snap 中进行链式查找的 case 表达式

转载 作者:行者123 更新时间:2023-12-02 16:13:16 24 4
gpt4 key购买 nike

我正在摆弄 Snap 框架,经常遇到我根据得到的参数进行数据库查找的情况来自表单字段。

考虑例如下面两个函数

getParam :: (MonadSnap m) => ByteString -> m (Maybe ByteString)
doLookup :: (MonadIO (m b v), MonadSnaplet m, MonadState s (m b b), HasAcid s UrlDB) => ByteString -> m b v (EventResult QueryByURL)

其中 UrlDB 是整数和 URL 之间的映射。第二个复杂的类型签名函数是由于酸态的使用而导致的,最终结果是Maybe Integer

queryByURL :: Text -> Query UrlDB (Maybe Integer)

到目前为止,我的处理程序看起来像

indexHandler :: Handler MyApp MyApp ()
indexHandler = do
mUrl <- getParam "url"
case mUrl of
Nothing -> render "index"
Just url -> do
mId <- doLookup $ url
case mId of
Nothing -> render "index"
Just i -> do
fancyStuffWith i
render "index"

现在,让我烦恼的第一件事是 case 表达式的阶梯。第二件事是渲染“index”的三重外观。基本上,每当两个 Maybe 值之一为 Nothing 时,我想返回默认 View 。

最干净的方法是什么?

最佳答案

这就是 MaybeT monad 转换器的用途。你的代码可以这样写。

indexHandler :: Handler MyApp MyApp ()
indexHandler = do
runMaybeT $ do
url <- MaybeT $ getParam "url"
i <- MaybeT $ doLookup url
fancyStuffWith i
render "index"

errors package将这些东西整合在一起,并添加了许多方便的功能来使用它们。除了 MaybeT 之外,EitherT monad 转换器也执行类似的操作,但会跟踪错误消息,以便您可以跟踪计算何时失败。

关于haskell - 避免在 Snap 中进行链式查找的 case 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23244385/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com