0

我正在尝试以与这些 Yesod 书籍示例isAdmin类似的方式实现该功能。问题是我想将我的“管理员”电子邮件保留在数据库中,但是当我进行数据库查询时,失去了它的纯度,所以我必须返回而不是仅仅返回. 现在,这废弃了 hamlet 中允许这样做的非常好的语法糖:isAdminHandler-something IO BoolBool

$if isAdmin
    <p ...

即使我调用数据库,有没有办法仍然拥有纯isAdmin函数(我严重怀疑......顺便说一句,我不想​​将任何参数传递给isAdmin)?或者也许我仍然可以将$if语法与不纯函数一起使用?

PS:目前,我在处理程序模块中使用 hack:

isadmin <- isAdmin

因此,我可以在对应于该处理程序的 hamlet 中编写:

$if isadmin

但它不是通用的,我更喜欢第一种方法。

4

1 回答 1

3

注意:我实际上并不知道 Yesod;这个答案基于一般的 Haskell 实践。

即使我调用数据库,有没有办法仍然拥有纯 isAdmin 函数(我严重怀疑

这确实是不可能的。对外部数据库的访问必须以一种或另一种方式存在于IO;没有其他办法了。

目前,我在处理程序模块中使用 hack:

isadmin <- isAdmin

因此,我可以在对应于该处理程序的 hamlet 中编写:

$if isadmin

这不是黑客攻击;它是使用一元计算结果的标准方法之一。事实上,在您链接到的 Yesod 书籍页面中,就在isAdmin您提到的示例之前,有一个片段运行数据库查询并以与$if您现在所做的非常相似的方式使用结果:

getBlogR :: Handler Html
getBlogR = do
    -- etc.
    entries <- runDB $ selectList [] [Desc EntryPosted]
    -- etc.
$if null entries
    -- etc.

PS:

注意:我不想将任何参数传递给 isAdmin

我想知道你为什么不想这样做。也许是因为您只需要检查单个特定用户是否是管理员。在这种情况下,您应该考虑将计算重命名为isCurrentUserAdmin(或在您的用例中有意义的任何名称)。看到像这样的名字会isAdmin引发“是管理员?”的问题,因此具有该名字的东西不接受任何参数是相当令人惊讶的。

于 2015-09-14T05:07:50.250 回答