これは、Danielに続くさらなる考えです。 Grids
はColors
のように見えました。小さな「グリッド」の場合はあまり効果がありませんが、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 |]
感謝を!それと別の場所で同じ問題が解決しました。 – Drew