配列を使ってみる

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