wvogel日記

自分用の技術備忘録が多めです.

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の利用は値の参照メインで利用するのが良いのでしょう。