Array を使ってみる。
> :m + Data.Array -- モジュールの import > :t listArray listArray :: (Ix i) => (i, i) -> [e] -> Array i e -- リストから配列を作ってみる。 > listArray (0,2) ["Hello","world","Hoge"] --=> array (0,2) [(0,"Hello"),(1,"world"),(2,"Hoge")] -- 配列の Index となる要素は C のように 0 である必要はなく、Ix のインスタンスであれば良い。 > listArray (100,102) ["Hello","world","Hoge"] --=> array (100,102) [(100,"Hello"),(101,"world"),(102,"Hoge")] > listArray ('a','c') ["Hello","world","Hoge"] --=> array ('a','c') [('a',"Hello"),('b',"world"),('c',"Hoge")] > listArray (-5,0) ['a'..] --=> array (-5,0) [(-5,'a'),(-4,'b'),(-3,'c'),(-2,'d'),(-1,'e'),(0,'f')]
「本物のプログラマはHaskellを使う / 第19回 配列でデータ・アクセスの効率を上げる」には独自のIxのインスタンスを作って配列のIndexとしています。
import Data.Array data Color = Red | Green | Blue deriving (Eq, Ord, Ix, Show) > listArray (Red,Blue) ["Hello","world","Hoge"] --=> array (Red,Blue) [(Red,"Hello"),(Green,"world"),(Blue,"Hoge")] > let array = listArray (Red,Blue) ["Hello","world","Hoge"] > bounds array --=> (Red,Blue) > indices array --=> [Red,Green,Blue] > elems array --=> ["Hello","world","Hoge"] > assocs array --=> [(Red,"Hello"),(Green,"world"),(Blue,"Hoge")]
- 配列の要素を取り出してみる。
> :t (!) (!) :: (Ix i) => Array i e -> i -> e > array ! Green --=> "world" > let array = listArray (1,100) [1..] > array ! 100 --=> 100 > array ! 1 --=> 1
- 配列の要素を更新してみる。
> :t (//) (//) :: (Ix i) => Array i e -> [(i, e)] -> Array i e > a // [(0,"Mooo")] > let b = a // [(0,"Mooo")] > b --=> array (0,2) [(0,"Mooo"),(1,"world"),(2,"Hoge")] > let array = listArray (0,5) [1000..] > array --=> array (0,5) [(0,1000),(1,1001),(2,1002),(3,1003),(4,1004),(5,1005)] > array // [(1,99)] --=> array (0,5) [(0,1000),(1,99),(2,1002),(3,1003),(4,1004),(5,1005)] > array // [(1,99),(2,999)] --=> array (0,5) [(0,1000),(1,99),(2,999),(3,1003),(4,1004),(5,1005)]
- array は新しく配列を構築する関数。
> :t array array :: (Ix i) => (i, i) -> [(i, e)] -> Array i e > array (0,5) [(0,1000),(1,1001),(2,1002),(3,1003),(4,1004),(5,1005)] --=> array (0,5) [(0,1000),(1,1001),(2,1002),(3,1003),(4,1004),(5,1005)] > :t accumArray accumArray :: (Ix i) => (e -> a -> e) -> e -> (i, i) -> [(i, a)] -> Array i e