> > shelarcy さんの言うインデックスというのは、
> > Ix クラスのデータ型と思っていいですか?
> 
> そうじゃないです。インデックスを使ってデータを引き出すデータ型一般
> のことです。

えっと。shelarcy さんの言うインデックスとは何でしょう?
コレクションから要素をルックアップするための key 一般のことですか?

とおもったけど。。。1.の議論では、配列の話のようだから、
1. では Ix クラスのインスタンスだという仮定でいいですよね。

> > Haskell では Ix を使うデータ型といえば、Array ですよね。
> >
> >> 1. wxHaskell 8.0 の Bitmap 管理改善は直接 Bitmap が扱え
> >> るようにしただけであって Pixel buffer の扱いを改善したようで
> >> はないようです。
> >>
> >> そのため以下の関数で画像の Filter 関数を書こうを書くことはでき
> >> ません(メモリ管理の都合上プログラムが正常に動かなくなります)が、
> >
> > なぜでしょう?なにがどのように書けないのでしょうか?
> 
> 書こうととしても書くことができませんですね。
> 
> 関数的には書けているはずなのに、実行しているものがエラーで動かない
> という話です。

とういことは、ライブラリのバグということですか?

> >> 新たに pixelBufferCreate と pixelBufferDelete が加わっ
> >> たため、Point x y をインデックスとし Int を格納するデータ型
> >> として定義すればなんとかなりそうな気がします。……が、Haskell
> >> で Multiarray ってありましたっけ? もしくはどのように定義す
> >> ればよいでしょうか?
> >
> > Multiarray って何でしょうか?多次元配列という意味ではないですよね?
> 
> あっ、そうです多次元配列です。Boost の用語に毒されてますね。

Haskell では、Array には多次元配列も含まれていますけど。。。
というか、Ix クラスのインスタンスであれば、なんでも、Array の
インデックスになれるので、多次元配列かどうかは意識する必要がないと
思いますけれど。

意識するのは、インデックスの方ですかね。たとえば、
Point x y を Ix のインスタンスであることを宣言するために、
Ix クラスのメソッド(range,index,inRange,rangeSize)
の実装をどうするかというときに、Point x y は二次元の構造を
持っていることは重要でしょう。

> >> 2. SML の以下の定義を Haskell に置き換えるために MultiIndex
> >> の Hash 関数を定義しようと思っているのですが、何かエレガント
> >> なアイデアはあるでしょうか?
> >
> > MultiIndex の Hash 関数とはどんなものなのでしょう。
> >
> > 私はSMLは全くわからないです。
> >
> > SML でのデータ構造は、何を表現するデータ型でしょう?
> > 何をどうする為のデータ構造ですか?
> >
> > 何がやりたいのか説明があると少しはわかるかも。。。
> > あるいは Haskell で書いたコードがあれば少しはわかるかも。。。
> 
> http://www.cs.cornell.edu/courses/cs312/2001sp/handouts/nj-hash.pdf
> 
> の Hash2TableFn の説明が分かりやすいかな?
> key を二つ持つ HashTable のそれぞれに key となるタイプと
> equal の条件 (hashVal については考えなくていいか)を定義して
> いるだけです。

key の型が Eq クラスのインスタンスであることを宣言したいということですよね?
だとすると、実際に使われる key の型が Eq クラスのインスタンスであること
を宣言することになりますから、key の具体的な型を教えてくださいまし。

あれっ。それとも、特定の範囲にだけ、equal を考えるのかな?

> >> Data.HashTable の上に Monad を使って定義することもできま
> >> すが、そうするとコードが命令型っぽくなって美しくありません。
> >
> > どのように定義しましたか?それを見ると何がやりたいのか分るかも。。。
> 
> ああ、まだ考えているだけで定義してません。

Hash Table をつくりたいということは、Hash Table への要素の出し入れを
するわけですよね。Monadic にやりたくないということなら、トップレベルの
操作関数はぜんぶ、Hash Table を状態変数として引数にとり、返り値は
更新された Hash Table を必ず含むタプルで書けばよいと思います。

{- 
ただ、状態の引き回し自身、順序処理なので、これは Monad を使って
抽象化して、命令的に書いたほうが、私には「美しい」という気分。
Data.HashTable が State Monad ではなく、IO モナドにしているのは
任意個の HashTable を扱えるようにするためでしょうね。
Handle のようなものでしょう。たぶん。^^;
-}

--nobsun@ねむねむ。。。


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/