Как согласовать типы между `hakyll` и`hakyll-images`

Я пытаюсь использовать hakyll а также hakyll-images реализовать пример из hakyll-images Readme, который выполняет масштабирование изображения, как мне нужно будет сделать. Типы не объединяются для данного примера, и я ищу совет о том, как действовать.

Плохой пример из 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, Типы функций, используемые из hakyll а также hakyll-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)

Image определяется в hakyll-images как type Image = Image_ ByteString, Я не уверен что Image_ является; его определение не связано в этой документации для Hakyll.Images модуль.

В любом случае, похоже, что пример из hakyll-images Readme не компилируется из-за Image не являясь примером Writable, Мне интересно, если возможно hakyll-images пакет не синхронизирован с hakyll в какой-то момент ведущий к примеру больше не компилируется.

Эта оценка кажется правильной? Что вы предлагаете для того, как я могу подойти к решению?

Я рассматриваю:

  • обновление hakyll-images каким-то образом добавив Writable экземпляр для Image,
  • Использование некоторого другого набора или комбинации функций для выполнения масштабирования изображения с сохранением пропорций.
  • рытье канав hakyll-images и найти другой способ масштабирования изображений.

1 ответ

Решение

Такое поведение является ошибкой, попавшей в выпуск hakyll-images 0.3.1. Это было впоследствии исправлено в hakyll-изображениях 0.4 и выше. Просто обновитесь до последней версии, чтобы избавиться от этой проблемы.

Это был грубый недосмотр, и тесты были добавлены так, что это больше не повторится.

Если вы хотите реализовать экземпляры самостоятельно, вы можете посмотреть, как это делается здесь.

Другие вопросы по тегам