On Thu, 18 Nov 2004 03:07:39 +0900, shelarcy  
<shelarcy / capella.freemail.ne.jp> wrote:
>>> エラー
>>>
>>> C:/develop/ImageViewer.hs:138:
>>>      Couldn't match `Color' against `a i e'
>>>          Expected type: IOArray Point Color
>>>          Inferred type: IOArray Point (a i e)
>>>      In the application `newListArray (bounds pixels)
>>>                                       ([lowpass p | p <- indices  
>>> pixels])'
>>>      In the definition of `lowpassFilter':
>>
>> この部分だけで、単に型を合せて、型チェックを黙らせるだけなら簡単に
>> できますけど、それが正しいかどうかは、shelarcy さんの意図を正確に理解
>> できていないのでわかりません。
>
>       bitmapLoad :: FilePath -> IO (Bitmap ())
>       bitmapLoad fpath
>         = do wxcBeginBusyCursor
>              im1 <- imageCreateFromFile fpath
>              px1 <- imageGetPixelIOArray im1
>              im2 <- imageCreateFromPixelIOArray (lowpassFilter px1)
>              bm2 <- bitmapCreateFromImage im2 (-1)
>              wxcEndBusyCursor
>              -- delete for performance reasons.
>              imageDelete im2
>              imageDelete im1
>              return bm2
>
> という文脈の中で使いたいので、型を合わせれば大丈夫ですが、単に左辺の型を
> m (IOArray Point Color) と宣言してやるだけではダメなようですね。
> うーん、型をあわせるにはどうしたらいいんだろ?

lowpassFilter の型宣言なしではうまくいきました。

      bitmapLoad :: FilePath -> IO (Bitmap ())
      bitmapLoad fpath
        = do wxcBeginBusyCursor
             im1 <- imageCreateFromFile fpath
             px1 <- imageGetPixelIOArray im1
             low  <- lowpassFilter px1
             im2 <- imageCreateFromPixelIOArray low
             bm2 <- bitmapCreateFromImage im2 (-1)
             wxcEndBusyCursor
             -- delete for performance reasons.
             imageDelete im2
             imageDelete im1
             return bm2



ちなみに lowpassFilter ::  IOArray Point Color -> m (IOArray Point Color)
では、以下のようなエラーがでました。

Could not deduce (MArray IOArray Color m) from the context ()
   arising from use of `newListArray' at C:/develop/ImageViewer.hs:186
Probable fix:
     Add (MArray IOArray Color m)
     to the type signature(s) for `lowpassFilter'
     Or add an instance declaration for (MArray IOArray Color m)
In the definition of `lowpassFilter':

MArray IOArray e IO が IOArray i e なはずなのに……と思いつつも
IOArray Point Color -> MArray IOArray Color m と宣言したところ
以下の通り。

Class `MArray' used as a type
When checking kinds in `MArray IOArray Color m'
In the type: forall m.
              IOArray Point Color -> MArray IOArray Color m
While checking the type signature for `lowpassFilter'

うーん、なんか釈然としない……。

-- 
shelarcy <shelarcy capella.freemail.ne.jp>
http://page.freett.com/shelarcy/