来自Yesod 书。
当 Hamlet 被调用时,它会自动访问范围内的变量。不需要专门传入变量。
这是什么深奥魔法?它如何自动知道范围内的变量是什么?
Hamlet 基于Template Haskell;特别是,quasiquoter (ie [hamlet| ... |]
) 用于内联模板,而 splice (ie $(hamletFile "foo")
) 用于从文件创建模板。然后使用 Template Haskell 的自省功能访问这些变量。
除了允许自动访问变量之外,这还有其他好处:
生成的模板可能比在运行时解析和解释的模板更有效,因为 Hamlet 模板在编译时被编译为常规的 Haskell 代码。
从文件中读取模板时,文件在编译时被解析并嵌入到生成的二进制文件中,因此模板不必在运行时保持在同一位置,并且模板的有效性是静态确保的。
我相信这些优势适用于所有莎士比亚家庭模板。Haddock 文档提供了有关可用准引用器和接头的更多信息。
这是 Haskell 的quasiquotation的一个特性,也就是[xxx| .... |]
语法。
quasiquoter 可以访问范围内的任何变量,因此可以对它们进行插值。插值的实际实现(如果有的话)取决于准引用器本身。