Array
今日大学の図書館で午前中書籍を物色していたら。
Arrayモジュールなるものがあることを知る。
むしろ今まで知らなかったのがショックだが....
Haskellでの配列表現が可能です。
こ、これは!
これで多次元配列を実現すればダイクストラも出来るのでは!!
第19回 本物のプログラマはHaskellを使う
の記事を参考にちょいと調べてみる
まずは基本的な関数達を
> :t array array :: Ix i => (i, i) -> [(i, e)] -> Array i e
この関数で実際に配列を作成します。
第一引数のタプルによって、配列の要素領域を指定、
第二引数に(インデックス、要素)のリストを渡します。
> :t listArray listArray :: Ix i => (i, i) -> [e] -> Array i e
arrayよりもこちらの方が実際使うときは便利かも?
要素のリストと、配列の範囲から、配列を作ってくれます。
arrayは、listArrayで作った配列から特定個所を切り出したいときに使うのが本来?
> :t (!) (!) :: Ix i => Array i e -> i -> e
リストの(!!)関数に似ていますね。
配列の要素にアクセスします。
【第19回 本物のプログラマはHaskellを使う】にありますが、この関数の表記は変わるかもしれないそう。
私は賛成です。頻繁に使う関数だから、簡潔な表記に越したことはないですが、
> :t (//) (//) :: Ix i => Array i e -> [(i, e)] -> Array i e
与えられたタプルのリストのうち、該当するインデックスから参照できる配列の要素を更新し、新たに作られた配列を返します。
おそらく、Haskellのリストなどでの挙動からしても、この関数のコストは高い、と考えます。
> :t bounds bounds :: Ix i => Array i e -> (i, i)
配列の長さを取り出してくれる
上でも書いたように、
値の更新はコストが大きくなる可能性があるので、Arrayの利用は値の参照メインで利用するのが良いのでしょう。