【问题标题】:Where does the resourcesApp come from in Yesod?Yesod中的resourcesApp从哪里来?
【发布时间】:2021-04-29 09:34:18
【问题描述】:

Yesod 框架中的 mkYesodData 和 mkYesodDispatch 两个函数应该将处理程序定义和调度过程分开。尽管出于某种奇迹(对我而言),模板使用了这个有趣的函数“resourcesApp”:

mkYesodDispatch "App" resourcesApp

我在 hoogle 中找到的唯一提及此功能的是在 Hledger 包中。而且它不是yesod依赖。

在 Haskell 学校,他们通过这个链接解释说,resourcesApp 是由 mkYesodData “生成”的,尽管它仍然不适用于我这边。 https://www.schoolofhaskell.com/school/advanced-haskell/building-a-file-hosting-service-in-yesod/part%202

有人知道对此的解释吗?提前谢谢你。

【问题讨论】:

  • 您能否提供更多背景信息,例如,您说的是哪些寺庙?也许添加一些文档/代码的链接?
  • 刚刚添加了haskell学校的链接
  • 这个问题需要一个最小的复制示例,以及您得到的确切错误。

标签: haskell yesod


【解决方案1】:

在 Yesod 的引擎盖下有一些 Template Haskell (TH),我认为这让你感到困惑。在文档中搜索时,Haskell 模板可能会令人困惑,因为它在编译时生成值,以便在运行时使用,而这些值在编译代码之前并不存在。 resourcesApp 只是这些值之一。

在您引用的代码中,作者描述您必须有另一个模块(他称之为Foundation),您在其中调用了mkYesodData。实际上,如果没有这个其他模块,Dispatch 模块中的代码将无法工作。奇怪的是,直到(第 4 部分)[https://www.schoolofhaskell.com/school/advanced-haskell/building-a-file-hosting-service-in-yesod/part%204] 他似乎才定义了Foundation模块,但是可以看到有一行:

mkYesodData "App" $(parseRoutesFile "config/routes")

这看起来不像定义了一个名为 resourcesApp 的值,但确实如此。

简而言之,您应该能够通过完成整个教程并完全运行代码来让您的代码正常工作。


如果你想知道的话,调用mkYesodData 需要一个String 然后字面上生成代码 定义一个值名称resources**** 其中**** 是你的字符串通过了。在这种情况下,这将是一个值resourcesApp,但在其他人的 Yesod 项目中,它可能是resourcesFoo。此外,由于这个resourcesFoo 值并没有具体在代码中,使用 Yesod 的项目通常不会在他们的导出列表或黑线鳕文档中显示它。实际上很奇怪,您甚至在 hoogle 上发现了 resourcesApp 的一次命中,但仔细检查后,这有点道理:Hledger 似乎是 yesod 周围的某种扩展接口,因此它们预先生成了 TH 值以便用户可以轻松访问它们。

另外,TH 在使用上有一些限制。一方面,您通常需要在与使用生成值的模块不同的模块中执行 TH 调用(通常称为“拼接”)。这可能就是为什么作者让你创建一个单独的Foundation 模块而不是仅仅将mkYesodData ... 行放在Dispatch 模块中。

【讨论】:

  • 非常感谢您的帮助!那么如果我们在mkYesod中构造一个路由/Main GET,就是类似的机制生成getMain等函数,对吗?
猜你喜欢
  • 1970-01-01
  • 2019-12-06
  • 2012-10-20
  • 1970-01-01
  • 2013-10-20
  • 2011-08-02
  • 1970-01-01
  • 2018-10-05
  • 2018-02-26
相关资源
最近更新 更多