यह डैनियल पर एक अतिरिक्त विचार है। ऐसा लगता है कि आपके Grids
केवल Colors
थे, शायद यह एक छोटे 'ग्रिड' के लिए बहुत कुछ नहीं करेगा, लेकिन Color
के लिए Unbox
उदाहरण बनाने के लिए तुलनात्मक रूप से आसान है। फिर एक ग्रिड में एक अनबॉक्स किए गए सरणी होगी। Grid.hs
में आप Data.Vector
के बजाय Data.Vector.Unboxed
आयात करेंगे। यह कई कारणों से सामान्य अधिक में बेहतर है, लेकिन आपको कई परिभाषाओं पर Unbox a =>
बाधा डालने की आवश्यकता होगी। इसका परिणाम हो सकता है यदि आप Color
की तुलना में किसी अन्य प्रकार की चीज़ों से भरे ग्रिड में 'मानचित्र' बनाना चाहते हैं, जब तक कि इसमें Unbox
उदाहरण न हो।
नीचे मैं केवल vector-th-unbox
से TH incantation जोड़ता हूं (मैंने हाल ही में उस पैकेज के बारे में सीखा है, और इस अवसर को फिर से परीक्षण करने के लिए अवसर ले रहा हूं) और दो आवश्यक परिभाषाएं। Data.Vector.Unboxed.Base
में बूल इंस्टेंस के बाद इसे हाथ से लिखना ज्यादा कठिन नहीं होगा।
{-#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