Ich möchte etwas Ähnliches wie die begrenzten Arrays im Standard-Array-Paket, aber mit Repa-Arrays erreichen.Repa-Arrays, die durch einen beschränkten Datentyp indiziert sind?
Was ist der schöne und saubere Weg, dies zu erreichen?
Dies ist, was ich versuchte, aber es muss ein besserer Weg, als alles, was in benutzerdefinierten Funktionen Verpackung, die für die Überprüfung von Grenzen:
import Data.Array.Repa
data C = A | F | L deriving (Eq,Enum,Ord,Bounded,Show)
data Ballot c = Ballot {
vote::Array U (Z :. Int) Int
} deriving Show
mkBallot::(Eq c ,Enum c,Ord c, Bounded c, Show c) => c -> Ballot c
mkBallot c = Ballot $ fromListUnboxed (Z :. max) (genSc c)
where
max = (fromEnum (maxBound `asTypeOf` c)) + 1
genSc::(Eq c,Enum c,Ord c,Bounded c,Show c) => c -> [Int]
genSc c = [ f x | x <- enumFrom (minBound `asTypeOf` c) , let f v = if x == c then 1 else 0]
showScore c b = index (vote b) (Z :. ((fromEnum c)))
Auch habe ich versucht, eine Shape-Instanz für (sh abzuleiten. C) aber ohne Erfolg kann ich nicht wirklich verstehen, wie einige der Interfaces implementiert werden, die in der Shape-Klasse für meinen Datentyp deklariert sind. Ich schreibe die Frage mit der Hoffnung, dass jemand anders einen Weg hat, aber wenn nicht, werde ich es erneut versuchen. Vielen Dank!
ich einen Blick auf diese nehmen. – user1105045