« またまた「FizzBuzz」 | トップページ | n Queen 問題 »

2011年12月15日 (木)

Haskell の配列

 こちらのブログで Haskell の二次元配列の話題が出ていました。
 コードの例が示してあり、「やはりCなどに比べると配列の準備が面倒ですね」と書いてあります。

 私は Haskell の配列に詳しいわけではないのですが、「listArray 関数」を使えば簡単に配列が作れるはずです。
 The Haskell 98 Reportには

配列は関数 listArray を使って境界対とインデックス順に ならべた値のリストから構築することもできる。
と書いてあります。

 

Prelude> :m +Data.Array Prelude Data.Array> listArray (0, 3) [0 .. 3] array (0,3) [(0,0),(1,1),(2,2),(3,3)] Prelude Data.Array> listArray ((0, 0), (1, 1)) [1 .. 4] array ((0,0),(1,1)) [((0,0),1),((0,1),2),((1,0),3),((1,1),4)]
 このように listArray 関数を使えば多次元配列も簡単に作れます。

 「listArray 関数」を使って作った配列には、(!) でインデックスを指定することでアクセスできます(多次元配列にも一発でアクセスできます)。

Prelude Data.Array> let a = listArray ((0, 0), (1, 1)) [1 .. 4] Prelude Data.Array> a array ((0,0),(1,1)) [((0,0),1),((0,1),2),((1,0),3),((1,1),4)] Prelude Data.Array> a ! (0,1) 2

 

 ということで、こちらのブログのコードと同様なコードを「listArray 関数」を使って書いてみました。
 "(!)" で直接アクセスできるので、「seeValue 関数」は定義しませんでした(「makeArray 関数」も定義しなくてよさそうでしたが、これは一応残しました)。

import Data.Array makeArray :: (Int, Int) -> [a] -> Array (Int, Int) a makeArray (x, y) xs = listArray ((1, 1), (x, y)) xs makeRange :: String -> (Int, Int) makeRange cs = (x, y) where [x, y] = map read $ take 2 $ words cs toIntList :: String -> [Int] toIntList cs = map read $ words cs main :: IO () main = do xy <- getLine xs <- getContents let arr = makeArray (makeRange xy) (toIntList xs) print arr print $ arr ! (2, 3)
$ ./array 4 4 1 2 3 4 5 6 7 8 1 2 4 8 7 7 7 7 array ((1,1),(4,4)) [((1,1),1),((1,2),2),((1,3),3),((1,4),4),((2,1),5),((2,2),6),((2,3),7),((2,4),8),((3,1),1),((3,2),2),((3,3),4),((3,4),8),((4,1),7),((4,2),7),((4,3),7),((4,4),7)] 7

« またまた「FizzBuzz」 | トップページ | n Queen 問題 »

Haskell」カテゴリの記事

コメント

listArrayなんてあるのですね!
arrayを使う方法では多次元配列の場合、どうしても煩雑になってしまいます。
可読性もあがり、操作間違いも起こりにくそうです。

「array 関数」を使って二次元配列を作るなら

makeArray :: (Int, Int) -> [a] -> Array (Int, Int) a
makeArray (x, y) zs = array ((1, 1), (x, y)) lst
where lst = zip [(x', y') | x' <- [1 .. x], y' <- [1 .. y]] zs

みたいにすればいいんでしょうが、「listArray 関数」のほうが簡単ですよね。

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112020/53488846

この記事へのトラックバック一覧です: Haskell の配列:

« またまた「FizzBuzz」 | トップページ | n Queen 問題 »

2016年7月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31            
フォト

最近のトラックバック

無料ブログはココログ