On Wed, 17 Nov 2004 21:24:29 +0900, shelarcy  
<shelarcy / capella.freemail.ne.jp> wrote:
>> なんでIOArrayに(!)を使いたいのかサッパリわからないのですが、
>> 実装するだけなら Data.Array.MArray.readArray と
>> System.IO.Unsafe.unsafePerformIO を使えばいいのでは?
>
> あっ、しまった readArray さえあればいいんですね。
> 型見れば Array での (!) に相当するってすぐわかったはずなのに……

でもとりあえずコードを書き直さないでいい方法として暫定的に (!) を作って
目的のプログラムを IOArray 用に修正してみたところ、newListArray のせいで
か変な振る舞いを示します。(listArray では大丈夫)

Data.Array.MArray.newListArray の定義自体には何も変なところがないのでき
ちんと動くはずだと思っていたのですが、コードのどのあたりに問題があるの
でしょうか?

lowpassFilter ::  IOArray Point Color ->  IOArray Point Color
lowpassFilter pixels
   = newListArray (bounds pixels) [lowpass p | p <- indices pixels]
   where
      lowpass :: Point -> Color
      lowpass (Point px py)
        = average [pixels!p | dx <- [-1..1]
                            , dy <- [-1..1]
                            , let p = Point (px+dx) (py+dy)
                            , valid p
                            ]

      average :: [Color] -> Color
      average colors
        = let r = avg colorRed
              g = avg colorGreen
              b = avg colorBlue
          in colorRGB r g b
        where
          avg f = sum (map f colors) `div` len
          len   = length colors

      valid :: Point -> Bool
      valid p
        = let (low,hi) = bounds pixels
              bound    = rectBetween low hi
          in rectContains bound p

      arr!k = unsafePerformIO $ readArray arr k


エラー

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':
         lowpassFilter pixels
                         = newListArray (bounds pixels) ([lowpass p | p <-  
indic
s pixels])
                         where
                             ! arr k = unsafePerformIO $ (readArray arr k)
                             valid :: Point -> Bool
                             valid p = let
                                         (low, hi) = ...
                                         bound = ...
                                       in rectContains bound p
                             average :: [Color] -> Color
                             average colors
                                       = let
                                           b = ...
                                           g = ...
                                           r = ...
                                         in colorRGB r g b
                                       where
                                           len = length colors
                                           avg f = (sum (map f colors))  
`div` le

                             lowpass :: Point -> Color
                             lowpass (Point px py)
                                       = average ([pixels ! p |
                                                       dx <- [- 1 .. 1], dy  
<- [
  1 .. 1], let p = ..., valid p])

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