-3

我正在尝试建立这个 Hakyll 博客。在尝试编译site.hs时,网站建设程序...

root@AR:/usr/local# git clone https://github.com/relrod/blog elrod.me
root@AR:/usr/local# cd elrod.me
root@AR:/usr/local/elrod.me# ghc --make site.hs

...我收到以下类型错误:

[1 of 1] Compiling Main ( site.hs, site.o ) site.hs:28:70: error:
  Couldn't match type ‘unordered-containers-0.2.7.2:Data.HashMap.Base.HashMap Data.Text.Internal.Text aeson-1.1.0.0:Data.Aeson.Types.Internal.Value’ with ‘M.Map [Char] a1’
  Expected type: M.Map [Char] a1
    Actual type: Metadata

  In the third argument of ‘M.findWithDefault’, namely ‘metadata’
  In the expression: M.findWithDefault "No title" "title" metadata
  In an equation for ‘title’: title = M.findWithDefault "No title" "title" metadata

  Relevant bindings include title :: a1 (bound at site.hs:28:25)

我该如何解决?以下是相关部分site.hs

{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Map as M
import Data.Monoid ((<>))
import Hakyll
import Text.Pandoc.Options (readerSmart)

main :: IO ()
main = hakyll $ do
    -- etc.
    match "posts/*" $ do
        route $ setExtension "html"
        compile $ do
            let safetitle = field "safetitle" $ \item -> do
                    metadata <- getMetadata (itemIdentifier item)
                    let title = M.findWithDefault "No title" "title" metadata
                    return $ concatMap (\x -> if x == '\'' then "\\'" else [x]) title
            pandocCompilerWith defaultHakyllReaderOptions {readerSmart = False} defaultHakyllWriterOptions
                >>= saveSnapshot "content"
                >>= loadAndApplyTemplate "templates/post.html"    (postCtx tags <> safetitle)
                >>= loadAndApplyTemplate "templates/default.html" defaultContext
                >>= relativizeUrls
   -- etc.
4

1 回答 1

3

这里的问题是自从 hakyll 版本(您尝试构建的项目的下限)以来,的表示Metadata已经改变。4.4.2.0.cabal

在 4.4.2.0 中,MetadataMap String String

在 4.9.5.0(最新)中,Metadata是一个Object.

您需要使用较旧版本的 Hakyll(例如,通过在文件中添加上限以.cabal确保Metadata的表示与版本 4.4.2.0 中的表示匹配)或更新代码以考虑较新的接口并提高下限.

于 2017-02-03T13:15:31.203 回答