2013-04-18 3 views
3

Я пытаюсь изучить компоненты RGB пикселей в изображении, но я не могу понять, как это сделать.Индексирование изображений с использованием repa-devil

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. Почему эти типы не совпадают? Я прочитал Repa Tutorial на Haskell wiki, но я до сих пор не вижу, как это сделать.

ответ

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> 
+0

D'oh! На самом деле это была проблема. Я должен был это заподозрить. И теперь я понимаю сообщение об ошибке. – mhwombat