我想深入研究 Yesod Web 框架,但我不确定如何去做。如果我可以在 GHCi 中单独并交互地测试每种方法,那将是完美的。所以我真的很想知道它在内部是如何工作的。这不仅仅是关于如何使用 Yesod 或任何其他库。这是一个合理的方法吗?如何处理其他人在 Haskell 中学习一个新库?
3 回答
Yesod 严重依赖于 Template Haskell、quasiquotes 和编译,甚至对于模板也是如此。您可以在命令行上对其进行一定程度的测试,但这将非常不方便。但是,Yesod Book非常全面,并且提供了适合初学者的介绍。
Web 框架在逐个方法的基础上进行测试并不是最容易的事情,因为它们需要大量的上下文。由于它们主要处理网络通信,因此它们总是必须在某些 monad 中运行(至少是 IO)。今天最流行的三个 Haskell Web 框架都定义了自己的 monad 以使事情更方便。通常,这将包括一个很好的状态,以跟踪诸如标头、解析的查询字符串和发布参数等内容。这意味着如果您想测试至少一些 Web 服务器 API,您将不得不具有完整的 HTTP 请求和/或从 Web 服务器 monad 的请求派生的所需基础数据。
现在当然可以创建一个 API 使上述所有操作变得更容易。Yesod 的版本在 wai-test 包中。Snap 的版本在 snap-core 的 Snap.Test 模块中。
Yesod 还非常依赖 Template Haskell (TH),它是 Haskell 的元编程库(如 Lisp 宏)。所有三个 Web 框架都在某些地方使用了 TH,但 Yesod 在其自定义的准引用 DSL 中更频繁地使用它。TH 需要两次通过。首先,您必须编译 TH 代码,然后执行该代码,生成新代码。然后新代码与其他所有内容一起编译到您的程序中。这种两遍系统意味着通常需要 TH 的代码在 GHCi 中比没有它的代码更难手动操作。
通常在我的 Web 应用程序中,我不只是从头开始运行 GHCi。我通常会加载另一个我编写的代码文件。这使我们能够解决 Template Haskell 问题,因为 Template Haskell 部分是在文件中指定的,并且在我启动 GHCi 时会生成代码。从那时起,您可以使用生成的任何功能。
玩 ghci 是学习库的好方法,但是对于像 yesod 这样的框架,你需要先熟悉一下结构。
我建议您先按照教程进行操作。熟悉了基本的代码结构后,就可以重点关注相关的库了,例如路由、模板、持久化。在学习这些库时,ghci 将成为您的朋友。