这个 YesodAuth 实例有什么问题?

2023-11-24

我刚刚从当前的 yesod 脚手架迁移到最新的yesod-1.6.0, yesod-auth-1.6.2.

instance YesodAuth App where
    type AuthId App = UserId

    -- ....

    authenticate creds = runDB $ do
        x <- getBy $ UniqueUser $ credsIdent creds
        case x of
            Just (Entity uid _) -> return $ Authenticated uid
            Nothing -> return $ UserError InvalidUsernamePass

在迁移之前,这段代码运行良好。但之后出现以下错误。

.../src/Foundation.hs:212:26: error:
    • Could not deduce: m ~ HandlerFor site8
      from the context: (MonadHandler m, HandlerSite m ~ App)
        bound by the type signature for:
                   authenticate :: forall (m :: * -> *).
                                   (MonadHandler m, HandlerSite m ~ App) =>
                                   Creds App -> m (AuthenticationResult App)
        at src/Foundation.hs:212:5-16
      ‘m’ is a rigid type variable bound by
        the type signature for:
          authenticate :: forall (m :: * -> *).
                          (MonadHandler m, HandlerSite m ~ App) =>
                          Creds App -> m (AuthenticationResult App)
        at src/Foundation.hs:212:5-16
      Expected type: m (AuthenticationResult App)
        Actual type: HandlerFor site8 (AuthenticationResult App)
    • In the expression:
        runDB
          $ do x <- getBy $ UniqueUser $ credsIdent creds
               case x of
                 Just (Entity uid _) -> return $ Authenticated uid
                 Nothing -> return $ UserError InvalidUsernamePass
      In an equation for ‘authenticate’:
          authenticate creds
            = runDB
                $ do x <- getBy $ UniqueUser $ credsIdent creds
                     case x of
                       Just (Entity uid _) -> return $ Authenticated uid
                       Nothing -> return $ UserError InvalidUsernamePass
      In the instance declaration for ‘YesodAuth App’
    • Relevant bindings include
        authenticate :: Creds App -> m (AuthenticationResult App)
          (bound at src/Foundation.hs:212:5)
    |
212 |     authenticate creds = runDB $ do
    |                          ^^^^^^^^^^...

我不知道为什么它无法通过类型检查。runDB在不相关的地方工作得很好yesod-auth.

EDIT:我提取了似乎相关的代码。

class (MonadResource m, MonadLogger m) => MonadHandler m where
    type HandlerSite m
    type SubHandlerSite m
    liftHandler :: HandlerFor (HandlerSite m) a -> m a
    liftSubHandler :: SubHandlerFor (SubHandlerSite m) (HandlerSite m) a -> m a

instance MonadHandler (HandlerFor site) where
    type HandlerSite (HandlerFor site) = site
    type SubHandlerSite (HandlerFor site) = site
    liftHandler = id
    {-# INLINE liftHandler #-}
    liftSubHandler (SubHandlerFor f) = HandlerFor f
    {-# INLINE liftSubHandler #-}

newtype HandlerFor site a = HandlerFor
    { unHandlerFor :: HandlerData site site -> IO a
    }
    deriving Functor

instance MonadHandler (HandlerFor site) where
    type HandlerSite (HandlerFor site) = site
    type SubHandlerSite (HandlerFor site) = site
    liftHandler = id
    {-# INLINE liftHandler #-}
    liftSubHandler (SubHandlerFor f) = HandlerFor f
    {-# INLINE liftSubHandler #-}

通过以上定义,我想知道以下内容无法通过类型检查的原因。

problem :: (MonadHandler m, HandlerSite m ~ App) => m ()
problem = (undefined :: HandlerFor App ())

    • Could not deduce: m ~ HandlerFor App
      from the context: (MonadHandler m, HandlerSite m ~ App)
        bound by the type signature for:
                   problem :: forall (m :: * -> *).
                          (MonadHandler m, HandlerSite m ~ App) =>
                          m ()
        at /intero/intero1940cny-TEMP.hs:210:1-52
      ‘m’ is a rigid type variable bound by
        the type signature for:
          problem :: forall (m :: * -> *).
                 (MonadHandler m, HandlerSite m ~ App) =>
                 m ()
        at /intero/intero1940cny-TEMP.hs:210:1-52
      Expected type: m ()
        Actual type: HandlerFor App ()
    • In the expression: (undefined :: HandlerFor App ())
      In an equation for ‘problem’: problem = (undefined :: HandlerFor App ())
    • Relevant bindings include
        problem :: m ()
          (bound at /intero/intero1940cny-TEMP.hs:211:1)

Put liftHandler .在每个之前runDB.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个 YesodAuth 实例有什么问题? 的相关文章

随机推荐

  • 如何尝试多个 SELECT 直到获得结果?

    如果我想以递减精度搜索表中的单行 例如像这样 SELECT FROM image WHERE name LIKE text AND group id 10 LIMIT 1 当这没有给我结果时 尝试这个 SELECT FROM image W
  • C++ 字符串排序像人类一样吗?

    我想按照人类对字母数字字符串进行排序的方式对其进行排序 即 A2 位于 A10 之前 a 当然位于 Z 之前 有没有什么方法可以不写迷你解析器 理想情况下 它还会将 A1B1 放在 A1B10 之前 我看到问题了 Microsoft SQL
  • 如何将一个数据帧映射到另一个数据帧(python pandas)?

    给定这两个数据帧 如何获得预期的输出数据帧 长的方法是循环遍历数据帧的行iloc然后使用map转换后的函数df2 to a dict将 x 和 y 映射到它们的分数 这看起来很乏味 并且在大型数据帧上运行需要很长时间 我希望有一个更清洁的解
  • 使用 python 验证 SSL 中的对等点

    我试图找出如何通过 python 中的服务器验证自签名证书 我在谷歌上找不到太多数据 我还想确保服务器网址 预先感谢您的任何见解 从我的第一个回复的评论中 我发现人们普遍误解了 验证证书的含义 我会尝试在这里写一个简短的解释 以消除一些幻想
  • JSON 中的根节点

    我的任务是定义两个网络应用程序之间的通信 我决定为此使用 JSON JSON 中具有根节点的情况有多常见 假设我们有一个汽车对象 这是以 Car 为根节点的 JSON Car Make Mustang YearBuilt 1999 现在假设
  • JVM 如何开始寻找类?

    我很好奇 JVM 寻找执行程序的所有位置 我更感兴趣的是了解 JVM 查找类文件的顺序和位置 例如它是否查找 java 库 扩展库 类路径等任何目录 例如调用 java 的当前目录 我对 JVM 行为更感兴趣 而不是类加载器如何加载类 我知
  • 如何缩放图片框中的某个点

    这是我的代码 我可以缩放图片框 但不能在某一点缩放 旋转鼠标滚轮时如何缩放到鼠标点 变量是 private double m dZoomscale 1 0 THIS IS THE ZOOM SCALE TO WHICH EACH OBJEC
  • SQLite 数据库文件支持的最大表数

    即使读完之后SQLite 限制我找不到最大表数一个SQLite数据库文件可以容纳 所以 我想知道是否 SQLite数据库可以容纳的最大表数有限制吗 SQLite 数据库文件中包含数千个小表是一个问题吗 SQLite 数据库文件中的许多表会影
  • 将 github 个人访问令牌与 TortoiseSVN 结合使用

    Github 下个月将关闭密码访问 因此我生成了个人访问令牌 PAT 然后 我尝试使用以下 URL 查看现有存储库的新副本 https 我 电子邮件受保护 我 myrepo git 其中 ghp blahblahblah 是我的 PAT 我
  • 从查询中获取表架构

    As per MSDN SqlDataReader GetSchemaTable返回所执行查询的列元数据 我想知道是否有类似的方法可以为给定的查询提供表元数据 我的意思是涉及哪些表以及它有哪些别名 在我的应用程序中 我收到查询 并且需要附加
  • 匹配正则表达式的所有单词列表

    假设我有一些字符串 Lorem ipsum dolor sat amet 我需要一个长度超过 3 的所有单词的列表 我可以使用正则表达式来完成吗 e g pattern re compile r some pattern result pa
  • 如何对数据库中的标签进行建模?

    我有一个现有的网络应用程序 想要添加标签功能 以便用户可以标记现有对象 问题是我应该为每个对象添加一个标签列吗 或者我应该对其进行标准化并使用标签表 其中每个对象都有一个标签集合 我倾向于后者 因为它感觉更干净 更容易报告并且更容易创建标签
  • 使用 Pandas 在 IPython 笔记本中显示多个输出表

    我现在知道我可以通过将 IPython pandas 嵌入到一个绘图空间中来输出多个图表 这些图表将出现在笔记本中的单个输出单元中 我可以用 Pandas HTML Tables 做类似的事情吗 我从电子表格上的多个选项卡 大约 15 20
  • ActionResult 返回调用它的页面

    我有一个 ActionLink 它调用我的公共 ActionResult 我希望它返回到调用它的页面 但是如何呢 为此 您可以使用一些技巧 最简单的是 return Redirect HttpContext Request UrlRefer
  • 使用 html 打开大写的 android 和 ios 键盘

    我正在为移动设备创建一个网页 因为很少有输入字段要求用户始终以大写形式输入数据 我看了几个选项 比如 text transformCSS的属性它将用户输入更改为大写 但也更改了占位符 这看起来不太好 autocapitalize输入属性通过
  • Flutter 中日期选择器的大小

    我正在 flutter 中制作 ipad 我有一个日期选择器 但在风景中它显得相当大 Is there any way to resize the date picker dialog 是的 您可以通过 Container SizedBox
  • 我只是不明白 C++ 指针/引用系统

    我从来没有遇到过像Python 隐式 或PHP 显式 中的引用问题 在 PHP 中你写 p myvar 你有 p作为参考指向 myVar 所以我知道在 C 中你可以这样做 void setToSomething int var var 12
  • 集合不包含与谓词匹配的元素

    我正在使用 Room 库 当我尝试构建应用程序时收到以下错误消息 e kapt An exception occurred java util NoSuchElementException Collection contains no el
  • Selenium Python 绑定:如何在元素上执行 JavaScript?

    使用python selenium脚本触发selenium服务器运行JavaScript代码 效果很好 drv execute script
  • 这个 YesodAuth 实例有什么问题?

    我刚刚从当前的 yesod 脚手架迁移到最新的yesod 1 6 0 yesod auth 1 6 2 instance YesodAuth App where type AuthId App UserId authenticate cre