2012-11-16 11 views
5

私のhaskellプログラムをプロファイリングした後、プログラムの66%がリストに索引付けされていることがわかりました。ソリューションはData.Vectorを使用しているようですが、変換に問題があります。ベクターを使用するコードを変更すると、トンとトンのメモリが使用され、ひどくハングアップします。何が原因でしょうか? https://github.com/drew-gross/Blokus-AI/blob/master/Grid.hsHaskell - ListからData.Vectorへの変換

し、それを変換で私の試み:私が間違っているの何https://github.com/drew-gross/Blokus-AI/blob/convert-to-vector/Grid.hs

任意のアイデアここで

は、私が変換したいファイルのですか?または少なくとも、どこを見るか?

答えて

6
makeEmptyGrid width height defaultCell = Grid (Data.Vector.take arraySize $ fromList $ repeat defaultCell) width height 

これはすぐそこにあるキラーです。 fromListはリスト全体をVectorに変換しますが、repeat defaultCellは無限のリストです。

makeEmptyGrid width height defaultCell = Grid (fromListN arraySize $ repeat defaultCell) width height 

または

makeEmptyGrid width height defaultCell = Grid (fromList $ replicate arraySize defaultCell) width height 

それを修正します。

残りの部分はかなりわかりませんが、明らかなトラップはありませんでしたが、私は簡単にいくつか見落としているかもしれません。

+0

感謝を!それと別の場所で同じ問題が解決しました。 – Drew

5

これは、Danielに続くさらなる考えです。 GridsColorsのように見えました。小さな「グリッド」の場合はあまり効果がありませんが、Colorの場合はUnboxインスタンスを作成するのが比較的簡単です。グリッドにはボックス化されていない配列が含まれます。 Grid.hsではData.VectorではなくData.Vector.Unboxedをインポートします。これは一般的に多くの理由でより良いですが、多くの定義にUnbox a =>という制約を付ける必要があります。これはインスタンスを持たない限り、Color以外の種類のものでいっぱいにしてグリッドを作成またはマップしたい場合に、結果をもたらす可能性があります。

以下、私はvector-th-unboxのTH呪文を追加しました(私はそのパッケージについて最近学びましたが、もう一度それをテストする機会を得ています)と2つの必要な定義です。 Data.Vector.Unboxed.BaseのBoolインスタンスに従えば手で書くのはそれほど難しくありません。

{-#LANGUAGE TemplateHaskell, TypeFamilies, MultiParamTypeClasses#-} 
module Color where 

import Display 
import Data.Vector.Unboxed.Deriving 
import qualified Data.Vector.Unboxed as V 
import qualified Data.Vector.Generic   as G 
import qualified Data.Vector.Generic.Mutable as M 
import Data.Word (Word8) 

data Color = Yellow | Red | Green | Blue | Empty  
      deriving (Show, Eq, Ord, Enum, Bounded) 

fromColor :: Color -> Word8 
{-# INLINE fromColor #-} 
fromColor = fromIntegral . fromEnum 

toColor :: Word8 -> Color 
{-# INLINE toColor #-} 
toColor x | x < 5 = toEnum (fromIntegral x) 
toColor _ = Empty 

derivingUnbox "Color" 
    [t| Color -> Word8 |] 
    [| fromColor |] 
    [| toColor |] 

-- test 
colorCycle :: Int -> V.Vector Color 
colorCycle n = V.unfoldr colorop 0 where 
    colorop m | m < n = Just (toColor (fromIntegral (m `mod` 5)),m+1) 
    colorop _ = Nothing 
-- *Colour> colorCycle 12 
-- fromList [Yellow,Red,Green,Blue,Empty,Yellow, 
-- Red,Green,Blue,Empty,Yellow,Red] 

colorBlack = "\ESC[0;30m" 
colorRed = "\ESC[0;31m" 
colorGreen = "\ESC[0;32m" 
colorYellow = "\ESC[0;33m" 
colorBlue = "\ESC[0;34m" 

instance Display Color where 
    display Red = colorRed ++ "R" ++ colorBlack 
    display Green = colorGreen ++ "G" ++ colorBlack 
    display Yellow = colorYellow ++ "Y" ++ colorBlack 
    display Blue = colorBlue ++ "B" ++ colorBlack 
    display Empty = "." 

編集:0.1の前vector-th-unboxのバージョンでは、以下のテンプレートを使用した:

derivingUnbox "Color" 
    [d| instance Unbox' (Color) Word8 |] 
    [| fromColor |] 
    [| toColor |] 
関連する問題