インデックスを使うデータ型について二つ質問があります。

1. wxHaskell 8.0 の Bitmap 管理改善は直接 Bitmap が扱え
るようにしただけであって Pixel buffer の扱いを改善したようで
はないようです。

そのため以下の関数で画像の Filter 関数を書こうを書くことはでき
ません(メモリ管理の都合上プログラムが正常に動かなくなります)が、
新たに pixelBufferCreate と pixelBufferDelete が加わっ
たため、Point x y をインデックスとし Int を格納するデータ型
として定義すればなんとかなりそうな気がします。……が、Haskell
で Multiarray ってありましたっけ? もしくはどのように定義す
ればよいでしょうか?


* sample の wxcore の ImageViewer の関数を書き換え

     onPaint vbitmap dc viewArea
       = do mbBitmap <- varGet vbitmap
            case mbBitmap of
              Nothing -> dcClear dc
              -- Just bm -> drawBitmap dc bm pointZero False []
              Just bm ->
                do
                    bsz <- bitmapGetSize bm
                    im <- imageCreateFromBitmap bm
                    pxe <- imageGetPixelBuffer im
                    let pixelPoint (Size ppx ppy) n = [Point x y  | x <-  
[n..ppx-n], y <- [n..ppy-n]]
                    let addRGB rgb1 rgb2 = colorFromInt $ (intFromColor  
rgb1) + (intFromColor rgb2)
                    let drawLowpassFilter pb (Point szx szy) = do
                          lowpass <- (lowpassFilter pxe (Point szx szy) bsz)
                          pixelBufferSetPixel pb (Point szx szy) lowpass
                    let fillpixelBuffer pb = do
                           mapM_ (drawLowpassFilter pb) (pixelPoint bsz 0)
                           return pb
                    px2 <- fillpixelBuffer pxe
                    im2 <-imageCreateFromPixelBuffer px2
                    bm2  <- bitmapCreateFromImage im2 (-1)
                    bitmapDelete bm
                    imageDelete im
                    drawBitmap dc bm2 pointZero True []
                      where
                        pixelColorInt pix (Point ptx pty) (Size szx szy)
                            | ptx < 0   = pixelColorInt pix (Point 0 pty)  
(Size szx szy)
                            | pty < 0   = pixelColorInt pix (Point ptx 0)  
(Size szx szy)
                            | ptx > szx = pixelColorInt pix (Point ptx pty)  
(Size 0 szy)
                            | pty < szy = pixelColorInt pix (Point ptx pty)  
(Size 0 szy)
                            | otherwise = do
                                pixel <- pixelBufferGetPixel pix (Point ptx  
pty)
                                return (intFromColor pixel)
                        lowpassFilter pix (Point szx szy) bound   = do
                            -- pixelsInt <- foldM (+) (pixelColorInt pix  
[Point x y  | x <- [szx-n..szx+n], y <- [szy-n..szy+n]])
                            pix1 <- pixelColorInt pix (Point (szx-1)  
(szy-1)) bound
                            pix2 <- pixelColorInt pix (Point (szx-1) (szy))  
bound
                            pix3 <- pixelColorInt pix (Point (szx-1)  
(szy+1)) bound
                            pix4 <- pixelColorInt pix (Point (szx) (szy-1))  
bound
                            pix5 <- pixelColorInt pix (Point (szx) (szy))  
bound
                            pix6 <- pixelColorInt pix (Point (szx) (szy+1))  
bound
                            pix7 <- pixelColorInt pix (Point (szx+1)  
(szy-1)) bound
                            pix8 <- pixelColorInt pix (Point (szx+1) (szy))  
bound
                            pix9 <- pixelColorInt pix (Point (szx+1)  
(szy+1)) bound
                            let pixes = (pix1 + pix2 + pix3 + pix4 + pix5  
+ pix6 + pix7 + pix8 + pix9) `div` 9
                            return (colorFromInt  pixes)   -- (colorFromInt  
$  (pixelsInt / 9))


2. SML の以下の定義を Haskell に置き換えるために MultiIndex
の Hash 関数を定義しようと思っているのですが、何かエレガント
なアイデアはあるでしょうか?

Data.HashTable の上に Monad を使って定義することもできま
すが、そうするとコードが命令型っぽくなって美しくありません。

structure TransTbl = Hash2TableFn (
     structure Key1 = struct
         type hash_key = thread_id
         val hashVal = hashTid
         val sameKey = sameTid
       end
     structure Key2 = struct
         type hash_key = int
         val hashVal = Word.fromInt
         val sameKey = (op = : (int * int) => bool)
       end)


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