BlazeHtml 教程建议使用 Reader monad使用BlazeHtml进行真实世界的模板化,但没有说明应该如何完成。我尝试遵循此建议。结果让我很困惑。
为了说明,假设我有一个简单的 User 类型,并且我想使用单独的函数来编写我的 HTML,一个用于布局,另一个用于显示用户信息的 HTML 页面的一部分。如果我使用 Reader Monad,它看起来像这样:
data User = User {
username :: Text
, userId :: nt
} deriving (Show)
userBox :: Reader User Html
userBox = do
user <- ask
return $ do
dl $ do
dt $ "Username"
dd $ H.toHtml $ username user
dt $ "UserId"
dd $ H.toHtml $ userId user
page :: Reader User Html
page = do
user <- ask
return $ H.docTypeHtml $ do
H.head $ title "Reader Monad Blaze Example"
H.body $ do
h1 $ "Hello world"
runReader userBox user
将此与我不使用 Reader monad 的版本进行比较:
userBox :: User -> Html
userBox user = do
dl $ do
dt $ "Username"
dd $ H.toHtml $ username user
dt $ "UserId"
dd $ H.toHtml $ userId user
page :: User -> Html
page user = do
H.docTypeHtml $ do
H.head $ title "Blaze Example, No Reader Monad"
H.body $ do
h1 $ "Hello world"
userBox user
所以我很难看到 Reader Monad 如何在实际用例中真正收紧模板代码。我错过了什么吗?