使用repa-devil索引图像

时间:2013-04-18 10:23:21

标签: haskell repa

我正在尝试检查图像中像素的RGB分量,但我无法弄清楚如何去做。

import Data.Array.Repa
import Data.Array.Repa.IO.DevIL
import Data.Word (Word8)

main = do
  (RGB ps) <- runIL $ readImage "test.jpeg"
  let k = (Z :. 142) :. 212 :. 0 :: DIM3
  print $ ps ! k

我得到的错误是:

[1 of 1] Compiling Main             ( amy.hs, interpreted )

amy.hs:8:15:
    Couldn't match expected type `Array r0 DIM3 a0'
                with actual type `repa-3.2.3.1:Data.Array.Repa.Base.Array
                                    repa-3.2.3.1:Data.Array.Repa.Repr.ForeignPtr.F
                                    repa-3.2.3.1:Data.Array.Repa.Index.DIM3
                                    Word8'
    In the first argument of `(!)', namely `ps'
    In the second argument of `($)', namely `ps ! k'
    In a stmt of a 'do' block: print $ ps ! k
Failed, modules loaded: none.

首先,我不明白这个消息。看起来编译器期望Array something DIM3 something,它有一个Array F DIM3 Word8。为什么这些类型不匹配?我已经阅读了Haskell维基上的Repa Tutorial,但我仍然没有看到如何使其工作。

1 个答案:

答案 0 :(得分:4)

我想你可能有两个不同版本的repa。检查说

ghc-pkg list repa

并查看显示的版本数量。我怀疑您是从一个实例导入Data.Array.Repa,但Data.Array.Repa.IO.DevIL取决于另一个实例。提示位于错误消息中:

Couldn't match expected type `Array r0 DIM3 a0'
            with actual type `repa-3.2.3.1:Data.Array.Repa.Base.Array

一旦,GHC说Array,有一次,它说repa-3.2.3.1:Data.Array.Repa.Base.Array。这通常意味着它明确希望在此处出现两次类型Array之间产生差异。

如果我的怀疑是正确的,您可以隐藏repa的一个版本(版本3.2.3.1并由repa-devil使用)通过

-hide-package repa-<version>

(填写了正确的版本号)到GHC,或者您可以通过

隐藏包裹
ghc-pkg hide repa-<version>