深可能与yesod堆叠

Mas*_*sse 6 haskell yesod

我正在尝试设置一个授权方案,我检查1.用户登录2.用户可以访问某个对象.为此,我首先调用maybeAuthId,然后尝试获取当前对象,并"加入"另一个列出权限的表.有两个级别的可能案例和一个级别的空列表案例.我想过使用MaybeT,但要么我太累了要让它工作,要么"不是真正的monad变换器"-handler-transformers不能和MaybeT一起使用.有没有一种很好的方式来处理深深的maybes?

编辑:

看起来我有点不清楚.我的意思是我有这样的事情:

case foo of
   Nothing -> something
   Just foo' -> do
      bar <- somethingelse
      case bar of
         Nothing -> ...
         Just bar' -> ...
Run Code Online (Sandbox Code Playgroud)

dfl*_*str 6

你可以完全使用MaybeTYesod.就这样做:

runMaybeT $ do
  uid <- MaybeT maybeAuthID
  car <- MaybeT . runDB . getBy $ UniqueCarOwner uid
  location <- MaybeT . liftIO . ciaLocateLicensePlate . licensePlate $ car
  country <- MaybeT . findCountry $ location
  return (car, country)
Run Code Online (Sandbox Code Playgroud)

正如您所说,大多数功能都没有针对Yesod中的通用错误处理进行优化.但是,如果你有某种形式的东西Monad m => m (Maybe a),你可以简单地用MaybeT它来把它翻到里面Monad m => Maybe (m a).