如何在“ hakyll”和“ hakyll-images”之间协调类型

时间:2019-01-20 06:42:20

标签: haskell hakyll

我正在尝试使用hakyllhakyll-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
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

错误是因为Image要求loadImage定义的类型compile是类型类Writable的实例。从黑客文档中复制的hakyllhakyll-images中使用的功能类型如下所示。

    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添加一个Writable实例来更新Image
  • 使用其他功能集或功能组合来执行保持宽高比的图像缩放。
  • 抛弃hakyll-images并找到其他缩放图像的方法。

1 个答案:

答案 0 :(得分:2)

此行为是一个臭虫,已进入hakyll-images 0.3.1版本。随后将其固定在hakyll图像0.4及更高版本中。只需更新到最新版本即可解决此问题。

这是一个粗略的疏忽,并且添加了一些测试,以使这种情况不再发生。

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