为什么我无法在Hakyll中定义任意字段?

时间:2016-07-09 03:55:22

标签: haskell hakyll

尝试定义"链接"我的索引页面上的字段,即使我创建了[ERROR] Missing field $links$ in context for item index.html字段,我也遇到了错误:links。 (至少我很确定我有...)

-- site.hs
main = hakyll $ do

    match "index.html" $ do
        route idRoute
        compile $ do
            links <- loadAll "links/*"
            let indexCtx =
                    listField "links" linkCtx (return links) `mappend`
                    constField "title" "Home"                `mappend`
                    defaultContext

            getResourceBody
                >>= applyAsTemplate indexCtx
                >>= loadAndApplyTemplate "templates/default.html" indexCtx
                >>= relativizeUrls

    match "templates/*" $ compile templateBodyCompiler


linkCtx :: Context String
linkCtx =
    field "link" $ \item -> return (itemBody item)
    defaultContext

-- index.html
<h2>Links</h2>
$partial("templates/link-list.html")$

-- templates/link-list.html
<ul>
    $for(links)$
        $link$
    $endfor$
</ul>

-- links/behance.markdown
---
title: Behance
---

[Behance](https://www.behance.net/laylow)

1 个答案:

答案 0 :(得分:1)

在尝试代码时,我没有遇到这样的错误。相反,我从linkCtx得到一个类型错误。它可以这样纠正:

linkCtx =
    field "link" (\item -> return (itemBody item)) `mappend`
    defaultContext

或更具惯用性,用point-free form替换lambda。

linkCtx =
    field "link" (return . itemBody) `mappend`
    defaultContext

此外,如果你想加载一些项目,你应该先匹配它们,以便hakyll知道它们的存在。

    match "links/*" $ compile pandocCompiler

进行上面列出的更改后,使用:stack build重建site.hs,链接列表将在index.html中呈现