Haskell の配列

Haskell で配列を使いたい場合,Data.Array.* を使うよりも,Data.Vector を使う方が良いらしい(Stack Overflowにあるすばらしい記事).

Tree の parent 関係が与えられたときに,child list を作成する例:

import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import qualified Data.Vector.Mutable as VM
import Control.Monad.ST
import Data.Foldable

-- We assume that the root node is 0.  foo[i] is the parent node of node (i+1)
foo :: VU.Vector Int
foo = VU.fromList [0, 0, 1, 2, 0, 3, 1, 4]

-- revv[i] is the list of children of node i
revv :: V.Vector [Int]
revv = V.create f
 where
   f :: ST s (V.MVector s [Int])
   f = do
     let len = VU.length foo
     v <- VM.replicate (len + 1) []
     for_ [1 .. len] $ \i -> VM.modify v (i :) (foo VU.! (i - 1))
     return v
-- We could write "V.create $ do ...", but here I want to write the type of f.

もちろん,revv を作るためだけなら foo を Vector にする必要はない.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*