鑑於最後一行中my Haskell learning project工作:與Hamletfile Q值精通返回值
writeText $ TL.toStrict (renderHtml $(hamletFile "fileList.hamlet"))
我想從hamletFile
的signature的輸出轉換:
FilePath -> Q Exp
到HTML類型預期由renderHtml
功能。
*很大的機會,我完全錯誤,我的上述斷言我目前正在做!
鑑於最後一行中my Haskell learning project工作:與Hamletfile Q值精通返回值
writeText $ TL.toStrict (renderHtml $(hamletFile "fileList.hamlet"))
我想從hamletFile
的signature的輸出轉換:
FilePath -> Q Exp
到HTML類型預期由renderHtml
功能。
*很大的機會,我完全錯誤,我的上述斷言我目前正在做!
你非常接近這個工作。正如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
來讓你的懶惰嚴格,並從那裏繼續。
基本上,表達式$(hamletFile "fileList.hamlet")
表示「在編譯時執行此函數調用以從Haskell源代碼生成」。它產生了什麼確切的代碼我不知道。
我不知道哈姆雷特,但可能有一些方法要求它在運行時做這個翻譯,而不是編譯時—,這可能是你想要的。
由於上述問題的答案和一些外界的幫助,我的工作代碼變成了:
writeText $ TL.toStrict (renderHtml ($(hamletFile "fileList.hamlet") "HTML"))
而且需要增加{-# LANGUAGE TemplateHaskell #-}
到腳本的頂部(事做與模板哈斯克爾工作的複雜性,它似乎)。
'Q'是一個模板haskell類型。我猜想你需要擴展它。 – 2014-09-03 11:01:56