在编译的Heist(Haskell)中将数据直接传递到模板中?

在编译的Heist(Haskell)中将数据直接传递到模板中?,haskell,haskell-snap-framework,heist,Haskell,Haskell Snap Framework,Heist,我使用编译的抢劫。我的接头仅执行运行时工作(无加载时工作)。我有一个模板.tpl如下: <html> <head> <title><titleSplice/></title> </head> <body> <bodySplice/> </body> </html> 这就是我做事的方式: 在/:param路由的捕捉操作中,我使用renderTemplate

我使用编译的抢劫。我的接头仅执行运行时工作(无加载时工作)。我有一个
模板.tpl
如下:

<html>
<head>
    <title><titleSplice/></title>
</head>
<body>
    <bodySplice/>
</body>
</html>

这就是我做事的方式:

  • /:param
    路由的捕捉操作中,我使用
    renderTemplate heistState“模板”
    获取
    MyHeistRuntimeMonad生成器
  • 我可以通过ReaderT将
    :param
    值放入我的运行时monad,将其传递给我的接头:
    键入MyHeistRuntimeMonad=ReaderT String IO
    。(其中
    字符串
    表示传入的
    :param
    值。)
这就是我的问题。将数据从路由传递到拼接的唯一方法是通过heist运行时monad。这让事情有点复杂。我的问题是:

  • 除了
    renderTemplate
    之外,是否没有其他方法允许我将数据直接传递到模板?例如,类似这样的内容:
    renderTemplate's“template”[(“titleSplice”、“myTitle”),(“bodySplice”、“myBody”)]
  • 如果这是不可能的,为什么不呢?我只是想知道为什么事情是这样设计的。我不太明白

  • 您所关注的运行时数据
    [(“titleSplice”、“myTitle”),(“bodySplice”、“myBody”)]
    的示例远不如Heist公开的模型强大。您的模型是简单的标记名替换。Heist的拼接模型是
    Node->m[Node]
    。这使得它可以做一些非常强大的事情,比如

    Heist使用的monad transformer方法是一个简单而明显的实现,它使拼接可以访问所有运行时数据。它还认为拼接是后端提供的通用API,前端设计师可以在任何地方使用。其他配方是否可行?我肯定有。但是这个简单而强大


    您的公式也非常特定于模板。如果设计师想要向页面添加一些新类型的数据,那么必须更改Haskell代码以适应这种情况。使用Heist的方法,没有必要更改Haskell代码。这给了设计师很大的力量,可以以一种非常解耦的方式改变事物。

    Wow。我还没有完全明白这一点,但这很有帮助。在抢劫(和抓捕)的运作方式背后,似乎有一些真实而深刻的哲学。要是有人能写一本关于它的书就好了!