完全にこちらの言葉不足ですね。

On Thu, 18 Nov 2004 01:55:27 +0900 (JST), Nobuo Yamashita  
<nobsun / sampou.org> wrote:
>> でもとりあえずコードを書き直さないでいい方法として暫定的に (!) を作って
>> 目的のプログラムを IOArray 用に修正してみたところ、newListArray のせいで
>> か変な振る舞いを示します。
>
> ??
> これって、どういう意味でしょう?
> 「変な振舞い」というのはプログラムの振舞いのことですか?コンパイラの振舞 
> いのことですか?
> 「newListArray のせい」ではなくて、それをまちがって使った所為ではない
> でしょうか?罪は newListArray にはないのではないかしらん。

型がどうしてそっちにいくか分からないという意味でした。

>> (listArray では大丈夫)
>
> ??
> listArray は自前で定義したのですか?それで上手くいくのなら、なぜそれを
> 使わないのでしょうか?

Array の listArray です。これだと lowpassFilter :: IOArray Point Color ->  
Array Point Color
でうまくいくので。


>> lowpassFilter ::  IOArray Point Color ->  IOArray Point Color
>> lowpassFilter pixels
>>    = newListArray (bounds pixels) [lowpass p | p <- indices pixels]
>
> の部分ですが、
>
>   lowpassFilter :: IOArray Point Color -> IOArray Point Color
>
> と宣言していますから、定義の左辺 lowpassFilter pixels の型は、
> IOArray Point Color ですよね。一方、
>
>   newListArray  :: (MArray a e m, Ix i) => (i,i) -> [e] -> m (a i e)
>
> なので、定義の右辺
> newListArray (bounds pixels) [lowpass p | p <- indices pixels] の型は
>  m (IOArray Point Color) ですよね。
>
> 左辺の型 IOArray Point Color
> 右辺の型 m (IOArray Point Color)
>
> これでは型が合わないですよね。ですから、以下のエラーになるわけです。
> というかエラーメッセージそのまんまですが。。。

ということはエラーメッセージの取り違えということのようですね。

lowpassFilter pixels
   = do
      val <-  newListArray (bounds pixels) [lowpass p | p <- indices pixels]
      return val

にすると

C:/develop/ImageViewer.hs:139:
     Couldn't match `Color' against `a Point Color'
         Expected type: Color
         Inferred type: a Point Color
     In the first argument of `return', namely `val'
     In the result of a 'do' expression: return val

と出てくるので、右辺の型が IOArray Point (IOArray Point Color) にでもなって
いるかと思ったのですが。

>> エラー
>>
>> 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) と宣言してやるだけではダメなようですね。
うーん、型をあわせるにはどうしたらいいんだろ?


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