2014-09-03 49 views
0

鑑於最後一行中my Haskell learning project工作:與Hamletfile Q值精通返回值

writeText $ TL.toStrict (renderHtml $(hamletFile "fileList.hamlet")) 

我想從hamletFilesignature的輸出轉換:

FilePath -> Q Exp 

到HTML類型預期由renderHtml功能。

*很大的機會,我完全錯誤,我的上述斷言我目前正在做!

+3

'Q'是一個模板haskell類型。我猜想你需要擴展它。 – 2014-09-03 11:01:56

回答

2

你非常接近這個工作。正如Bartek和MathicalOrchid都說的那樣,hamletFile "fileList.hamlet"的類型爲Q Exp,這意味着「GHC可以運行它來生成表達式。」通過將其包裝在$(...)中,您的意思是,「GHC,請生成一個表達。」下一個問題你需要問一下:這個生成的表達式的類型是什麼?

您可以在shakespeare chapter of the Yesod book獲得更多的信息,但表達將有類型:

(url -> [(Text, Text)] -> Text) -> Html 

這基本上意味着「請告訴我如何把URL和一些查詢字符串參數轉換爲文本,我會給你一些HTML。「如果您的模板中沒有使用任何類型安全的URL,則可以簡單地提供undefined(或切換爲使用shamletFile,請參閱本章獲取更多信息)。

一旦你提供了URL渲染功能,你可以使用renderHtml來讓你的懶惰嚴格,並從那裏繼續。

1

基本上,表達式$(hamletFile "fileList.hamlet")表示「在編譯時執行此函數調用以從Haskell源代碼生成」。它產生了什麼確切的代碼我不知道。

我不知道哈姆雷特,但可能有一些方法要求它在運行時做這個翻譯,而不是編譯時—,這可能是你想要的。

1

由於上述問題的答案和一些外界的幫助,我的工作代碼變成了:

writeText $ TL.toStrict (renderHtml ($(hamletFile "fileList.hamlet") "HTML"))

而且需要增加{-# LANGUAGE TemplateHaskell #-}到腳本的頂部(事做與模板哈斯克爾工作的複雜性,它似乎)。