我正在尝试使用hakyll
和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
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
错误是因为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
module的文档中未链接其定义。
在任何情况下,由于hakyll-images
不是Image
的实例,似乎Writable
自述文件中的示例无法编译。我想知道hakyll-images
包是否在某个时候与hakyll
不同步,导致示例不再编译。
此评估似乎正确吗? 您对我如何解决问题有何建议?
我正在考虑:
hakyll-images
添加一个Writable
实例来更新Image
。hakyll-images
并找到其他缩放图像的方法。答案 0 :(得分:2)
此行为是一个臭虫,已进入hakyll-images 0.3.1版本。随后将其固定在hakyll图像0.4及更高版本中。只需更新到最新版本即可解决此问题。
这是一个粗略的疏忽,并且添加了一些测试,以使这种情况不再发生。
如果您想自己实现实例,可以看看它是如何完成的here。