如何协调 `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
定义的类型 Image
被 compile
要求成为类型类 Writable
的实例。 hakyll
和 hakyll-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)
Image
在 hakyll-images
中定义为 type Image = Image_ ByteString
。
我不确定 Image_
是什么; Hakyll.Images
module.
的文档中未链接其定义
无论如何,hakyll-images
自述文件中的示例似乎无法编译,因为 Image
不是 Writable
的实例。我想知道 hakyll-images
包是否在某些时候与 hakyll
不同步导致示例不再编译。
这个评估看起来正确吗?
您对我如何处理解决方案有何建议?
我正在考虑:
- 通过某种方式为
Image
添加 Writable
实例来更新 hakyll-images
。
- 使用其他一些函数集或函数组合来执行保持纵横比的图像缩放。
- 放弃
hakyll-images
并寻找其他缩放图像的方法。
此行为是一个错误,已进入 hakyll-images 0.3.1 版本。它随后在 hakyll-images 0.4 及更高版本中得到修复。只需更新到最新版本即可解决此问题。
这是一个严重的疏忽,已经添加了测试,以防止再次发生这种情况。
如果您想自己实现实例,可以看看它是如何实现的here。
我正在尝试使用 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
定义的类型 Image
被 compile
要求成为类型类 Writable
的实例。 hakyll
和 hakyll-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)
Image
在 hakyll-images
中定义为 type Image = Image_ ByteString
。
我不确定 Image_
是什么; Hakyll.Images
module.
无论如何,hakyll-images
自述文件中的示例似乎无法编译,因为 Image
不是 Writable
的实例。我想知道 hakyll-images
包是否在某些时候与 hakyll
不同步导致示例不再编译。
这个评估看起来正确吗? 您对我如何处理解决方案有何建议?
我正在考虑:
- 通过某种方式为
Image
添加Writable
实例来更新hakyll-images
。 - 使用其他一些函数集或函数组合来执行保持纵横比的图像缩放。
- 放弃
hakyll-images
并寻找其他缩放图像的方法。
此行为是一个错误,已进入 hakyll-images 0.3.1 版本。它随后在 hakyll-images 0.4 及更高版本中得到修复。只需更新到最新版本即可解决此问题。
这是一个严重的疏忽,已经添加了测试,以防止再次发生这种情况。
如果您想自己实现实例,可以看看它是如何实现的here。