在Haskell中使用Hamlet而不使用Yesod

在Haskell中使用Hamlet而不使用Yesod,haskell,hamlet,Haskell,Hamlet,有谁能给我举个例子,告诉我如何在没有野草的情况下使用哈姆雷特?这是一个很好的文档,但我无法让我的ghci会话在不崩溃的情况下渲染一个简单的hamlet模板。好吧,通过手动渲染URL并以最愚蠢的方式进行操作,我们可以使用以下方法: hamVal=[$hamlet| 测试页 测试 |] test::ByteString test=renderHamlet(\\\\\>“”)hamVal 这和预期的一样。我想您可能想做一些稍微有用的事情,但是这里的这个小例子效果很好,因此如果不知道您遇到了什么问题,

有谁能给我举个例子,告诉我如何在没有野草的情况下使用哈姆雷特?这是一个很好的文档,但我无法让我的ghci会话在不崩溃的情况下渲染一个简单的hamlet模板。

好吧,通过手动渲染URL并以最愚蠢的方式进行操作,我们可以使用以下方法:

hamVal=[$hamlet|
测试页
测试
|]
test::ByteString
test=renderHamlet(\\\\\>“”)hamVal

这和预期的一样。我想您可能想做一些稍微有用的事情,但是这里的这个小例子效果很好,因此如果不知道您遇到了什么问题,就很难再多说了。

下面的例子展示了大多数基本内容,包括键入URL的呈现

{-# LANGUAGE TemplateHaskell, QuasiQuotes #-}

import Data.Text
import Text.Blaze.Html.Renderer.String (renderHtml)
import Text.Hamlet hiding (renderHtml)

data Url = Haskell | Yesod

renderUrl Haskell _ = pack "http://haskell.org"
renderUrl Yesod   _ = pack "http://www.yesodweb.com"

title = pack "This is in scope of the template below"

template :: HtmlUrl Url
template = [hamlet|
<html>
    <head>
        #{title}
    <body>
        <p>
            <a href=@{Haskell}>Haskell
            <a href=@{Yesod}>Yesod
|]

main = do
    let html = template renderUrl
    putStrLn $ renderHtml html
{-#语言模板haskell,准语言}
导入数据.Text
导入Text.Blaze.Html.Renderer.String(renderHtml)
导入文本。哈姆雷特隐藏(renderHtml)
数据Url=Haskell | Yesod
renderUrl Haskell u=pack”http://haskell.org"
renderUrl Yesod uxD=pack”http://www.yesodweb.com"
title=pack“这在下面的模板范围内”
模板::HtmlUrl
模板=[hamlet|
#{title}


如果您演示了在GHCi中执行的操作以及它是如何崩溃的,可能会有所帮助。按原样尝试会导致ghc编译错误:如果我将@{}更改为#{}我明白了:使用
runghc
ghc7.0.2
hamlet0.8.2
运行它很好。您是如何运行它的?第一个错误看起来很奇怪。语言pragmas是如何在HTML中结束的?第二个看起来您只需要删除一些
pack
调用。这是试图运行ghc的--make,尝试runghc我得到了ghc 7.0.3《哈姆雷特》0.6.1.2——哦,我的版本比你的版本老了一点。也许语法已经改变了:(啊,我发现了。显然哈姆雷特过去更像哈姆尔,我的版本就是那个旧语法。所以,我把它编译了,但令人惊讶的是,它输出测试页面测试,而不是预期的转换成正确的htmlAh,我发现了。显然哈姆雷特过去更像哈姆尔,我的版本就是那个旧语法
<html><head>This is in scope of the template below</head>
<body><p><a href="http://haskell.org">Haskell</a>
<a href="http://www.yesodweb.com">Yesod</a>
</p>
</body>
</html>