2

約1か月ほど前まで、すべてがうまく機能していました...

突然私は得ています

 berkson.github.io/source/blog.hs: 333, 42
 • Couldn't match type ‘unordered-containers-0.2.7.1:Data.HashMap.Base.HashMap
                          text-1.2.2.1:Data.Text.Internal.Text
                          aeson-0.11.2.0:Data.Aeson.Types.Internal.Value’
                  with ‘M.Map [Char] [Char]’
   Expected type: M.Map [Char] [Char]
     Actual type: Metadata
 • In the first argument of ‘(M.!)’, namely ‘md’
   In the first argument of ‘(++)’, namely ‘(md M.! "author")’
   In the second argument of ‘(++)’, namely ‘(md M.! "author") ++ "/"’

コードから:

 directorizeDateAndAuthor :: Routes
 directorizeDateAndAuthor = metadataRoute $ \md ->
     gsubRoute "/[0-9]{4}-[0-9]{2}-[0-9]{2}-" $ \s ->
         replaceAll "-" (const "/") s ++ (md M.! "author") ++ "/"

それが何を伝えているのか、正確に解読するのを手伝ってくれませんか?私の側にある種の構文エラーがあるようですが、何が変更されたのか、なぜ以前のようにコンパイルされないのか理解できませんか?

参照: https://github.com/berkson/berkson.github.io/blob/source/source/blog.hs#L330

4

1 に答える 1

4

hakyll 4.8 より前では、Metadata型シノニムは次のように定義されていました。

type Metadata = HashMap.Map String String

メタデータは、キーと値のペアの単純なリストでした。

hakyll 4.8 では、より複雑なメタデータ構造を可能にするために、YAML パーサーを使用するようにメタデータの解析 ( issuecommitrelease anouncement ) が変更されました。現在、型シノニムは次のとおりです。

type Metadata = Aeson.Object

これはObjectfromaesonパッケージです –Data.Yamlライブラリは型を共有します。

残念ながら、 の取り扱いは以前Aeson.Objectほど簡単ではありませんMap。Aeson を適切に使用する方法を学ぶには、長いチュートリアルを読むことができます。

幸いなことに、JasperlookupStringは、ほとんどドロップインの代替となる関数を提供してくれましたHashMap.!

(!) :: Metadata -> String -> String
lookupString :: String -> Metadata -> Maybe String

Maybe 値をアンラップすると、次のようなコードが得られます。

directorizeDateAndAuthor :: Routes
directorizeDateAndAuthor = metadataRoute $ \md ->
  case lookupString "author" md of
      Just author ->
          gsubRoute "/[0-9]{4}-[0-9]{2}-[0-9]{2}-" $ \s ->
              replaceAll "-" (const "/") s ++ author ++ "/"
      Nothing -> error "The author metadata field is missing."
于 2016-06-15T08:02:56.073 に答える