3

我正在尝试检查图像中像素的 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 wiki 上的Repa 教程,但我仍然不知道如何使它工作。

4

1 回答 1

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>
于 2013-04-18T11:45:04.070 回答