我正在尝试构建this Hakyll blog。在尝试编译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.
答案 0 :(得分:3)
这里的问题是{hansll的版本Metadata
之后4.4.2.0
的表示已经发生了变化(您正在尝试构建的项目.cabal
的下限)。< / p>
在4.4.2.0中,Metadata
is a Map String String
在4.9.5.0(最新版)中,Metadata
is an Object
。
您需要使用较旧版本的Hakyll(例如,在.cabal
文件中添加上限以确保Metadata
的表示与版本4.4.2.0中的表示匹配)或更新代码考虑到较新的界面并碰撞下限。