M.Map 突发预期类型错误
M.Map sudden expected type error
直到大约一个月前,一切都运行良好...
我突然变得
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
在 hakyll 4.8 之前,Metadata
类型同义词定义如下:
type Metadata = HashMap.Map String String
元数据只是 key – value 对的平面列表。
在 hakyll 4.8 中,元数据解析已更改 (issue, commit, release anouncement) 以使用 YAML 解析器,以允许更复杂的元数据结构。现在,类型同义词如下:
type Metadata = Aeson.Object
这是 Object
from aeson
package – Data.Yaml
库共享类型。
不幸的是,处理 Aeson.Object
并不像处理 Map
那样简单。学习如何正确使用爱生,可以阅读lengthy tutorial.
幸运的是,Jasper 为我们提供了一个函数 lookupString
,它几乎可以替代 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."
直到大约一个月前,一切都运行良好...
我突然变得
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
在 hakyll 4.8 之前,Metadata
类型同义词定义如下:
type Metadata = HashMap.Map String String
元数据只是 key – value 对的平面列表。
在 hakyll 4.8 中,元数据解析已更改 (issue, commit, release anouncement) 以使用 YAML 解析器,以允许更复杂的元数据结构。现在,类型同义词如下:
type Metadata = Aeson.Object
这是 Object
from aeson
package – Data.Yaml
库共享类型。
不幸的是,处理 Aeson.Object
并不像处理 Map
那样简单。学习如何正确使用爱生,可以阅读lengthy tutorial.
幸运的是,Jasper 为我们提供了一个函数 lookupString
,它几乎可以替代 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."