Haskellにおける配列操作の概要(21)

インデックス型(Ix)

配列の添字として使用される型です。

Prelude> :m +Data.Array
Prelude Data.Array> data Color = Red | Orange | Yellow | Green | Blue | Indigo | Violet deriving (Show,Eq,Ord,Ix)
Prelude Data.Array> range (Yellow,Blue)
[Yellow,Green,Blue]
Prelude Data.Array> index (Yellow,Blue) Green
1
Prelude Data.Array> inRange (Yellow,Blue) Red
False

配列型(Array と UArray)

配列は二つの型パラメータを持ち、それぞれ添字の型 i と要素の型 e です。 Arrayはボックス化された配列(要素がポインタ)であり、 UArrayは非ボックス化された配列(要素が直接格納)です。

Prelude> :m +Data.Array
Prelude Data.Array> a = array (1,10) ((1,1) : [(i, i + a!(i-1)) | i <- [2..10]]) 
Prelude Data.Array> :t a
a :: (Ix e, Num e, Enum e) => Array e e
Prelude Data.Array> a!10
55
Prelude Data.Array> bounds a
(1,10)
Prelude Data.Array> indices a
[1,2,3,4,5,6,7,8,9,10]
Prelude Data.Array> elems a
[1,3,6,10,15,21,28,36,45,55]
Prelude Data.Array> assocs a
[(1,1),(2,3),(3,6),(4,10),(5,15),(6,21),(7,28),(8,36),(9,45),(10,55)]
Prelude Data.Array> array ((1,1),(2,2)) [((2,1),"C"),((1,2),"B"),((1,1),"A"),((2,2),"D")] ! (2,2)
"D"
Prelude Data.Array> array ('a','c') [('a',"AAA"),('b',"BBB"),('c',"CCC")] ! 'b'
"BBB"
Prelude> :m +Data.Array.Unboxed
Prelude Data.Array.Unboxed> a = listArray (1,10) [1..10] :: UArray Int Int
Prelude Data.Array.Unboxed> a
array (1,10) [(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10)]
Prelude Data.Array.Unboxed> a // [(1,100),(2,99)]
array (1,10) [(1,100),(2,99),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8),(9,9),(10,10)]

IO配列型(IOArray と IOUArray)

IOモナド内で利用可能な配列型です。

関数 引数 説明
newArray 範囲と初期値 初期値付きの新しい配列を作成
readArray 配列とインデックス 指定した位置の要素を読み出す
writeArray 配列、インデックス、値 指定した位置に値を書き込む
getElems 配列 すべての要素を取得
Prelude> :m +Data.Array.IO
Prelude Data.Array.IO> a <- newArray (0, 2) 0 :: IO (IOUArray Int Int)
Prelude Data.Array.IO> getElems a
[0,0,0]
Prelude Data.Array.IO> writeArray a 0 3
Prelude Data.Array.IO> readArray a 0
3
Prelude Data.Array.IO> writeArray a 1 6
Prelude Data.Array.IO> getElems a
[3,6,0]
Prelude Data.Array.IO> writeArray a 2 7
Prelude Data.Array.IO> getElems a
[3,6,7]

ST配列型(STArray と STUArray)

STモナド内で使用する配列型です。

-- https://stackoverflow.com/questions/8197032/starray-documentation-for-newbies-and-state-st-related-questions

import Control.Monad
import Control.Monad.ST
import Data.Array.ST
import Data.Array.Unboxed

primesUpTo :: Int -> [Int]
primesUpTo n = [p | (p, True) <- assocs $ sieve n]

sieve :: Int -> UArray Int Bool
sieve n = runSTUArray $ do
    sieve <- newArray (2, n) True
    forM_ [2..n] $ \p -> do
        isPrime <- readArray sieve p
        when isPrime $ do
            forM_ [p*2, p*3 .. n] $ \k -> do
                writeArray sieve k False
    return sieve
    
main = print $ primesUpTo 100

タグ: Haskell Array Ix UArray IOArray

5月21日 07:16 投稿