如何协调 `hakyll` 和 `hakyll-images` 之间的类型

How to reconcile types between `hakyll` and `hakyll-images`

我正在尝试使用 hakyll and hakyll-images 来实现 hakyll-images 自述文件中的示例,该示例执行我需要执行的图像缩放。对于给定的示例,类型不统一,我正在寻求有关如何进行的建议。

hakyll-images Readme 中的失败示例如下。

import Hakyll
import Hakyll.Images        ( loadImage
                            , scaleImageCompiler
                            )
main = hakyll $ do
    -- Scale images to fit within a 600x400 box
    -- Aspect ratio will be preserved
    match "images/*" $ do
        route idRoute
        compile $ loadImage
            >>= scaleImageCompiler 600 400

尝试编译报错:

site.hs:12:9: error:
    • No instance for (Writable
                         hakyll-images-0.3.1:Hakyll.Images.Common.Image)
        arising from a use of ‘compile’
    • In a stmt of a 'do' block:
        compile $ loadImage >>= scaleImageCompiler 600 400
      In the second argument of ‘($)’, namely
        ‘do route idRoute
            compile $ loadImage >>= scaleImageCompiler 600 400’
      In a stmt of a 'do' block:
        match "images/*"
          $ do route idRoute
               compile $ loadImage >>= scaleImageCompiler 600 400
   |
12 |         compile $ loadImage >>= scaleImageCompiler 600 400
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

错误是因为 loadImage 定义的类型 Imagecompile 要求成为类型类 Writable 的实例。 hakyllhakyll-images 中使用的函数类型,从 hackage 文档中复制,如下所示。

    route :: Routes -> Rules ()
    idRoute :: Routes
    compile :: (Binary a, Typeable a, Writable a) => Compiler (Item a) -> Rules ()
    loadImage :: Compiler (Item Image)
    scaleImageCompiler :: Width -> Height -> Item Image -> Compiler (Item Image)

Imagehakyll-images 中定义为 type Image = Image_ ByteString。 我不确定 Image_ 是什么; Hakyll.Images module.

的文档中未链接其定义

无论如何,hakyll-images 自述文件中的示例似乎无法编译,因为 Image 不是 Writable 的实例。我想知道 hakyll-images 包是否在某些时候与 hakyll 不同步导致示例不再编译。

这个评估看起来正确吗? 您对我如何处理解决方案有何建议?

我正在考虑:

此行为是一个错误,已进入 hakyll-images 0.3.1 版本。它随后在 hakyll-images 0.4 及更高版本中得到修复。只需更新到最新版本即可解决此问题。

这是一个严重的疏忽,已经添加了测试,以防止再次发生这种情况。

如果您想自己实现实例,可以看看它是如何实现的here