Как согласовать типы между `hakyll` и` hakyll-images` - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь использовать 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 .

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

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

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

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

1 Ответ

0 голосов
/ 22 января 2019

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

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

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

...