我试图设置一种授权方案,以检查1.用户已登录2.用户有权访问某个对象。为此,我首先调用maybeAuthId,然后尝试获取当前对象,然后“加入”到列出权限的另一个表中。有两个级别的可能案例和一个空列表案例。我曾考虑过使用MaybeT,但是要么我太累了,要么无法使用它,或者MaybeT无法使用“不是真正的monad变压器” -handler-transformers。有没有很好的方法来处理深层的可能?

编辑:

我似乎还不清楚。我的意思是我有这样的事情:

case foo of
   Nothing -> something
   Just foo' -> do
      bar <- somethingelse
      case bar of
         Nothing -> ...
         Just bar' -> ...

最佳答案

您可以完全将MaybeT用于Yesod。像这样做:

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

如您所说,大多数功能并未针对Yesod中的常规错误处理进行优化。但是,如果您使用Monad m => m (Maybe a)的形式,则可以简单地使用MaybeT将其内翻为Monad m => Maybe (m a)

10-06 02:43