Voglio ottenere qualcosa di simile agli array limitati nel pacchetto di array standard ma usando array di repa.Array di Repa indicizzati da un tipo di dati limitato?
Qual è il modo bello e pulito per raggiungere questo obiettivo?
Questo è quello che ho provato, ma ci deve essere un modo migliore di avvolgere tutto in funzioni personalizzate che verificare la presenza di limiti:
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)))
Inoltre ho cercato di ricavare un'istanza Shape per (sh:. C) ma inutilmente, non riesco davvero a capire come implementare alcune delle interfacce dichiarate nella classe Shape per il mio tipo di dati. Sto scrivendo la domanda con la speranza che qualcun altro abbia un modo, ma se no, ci riproverò. Grazie!
farò dare un'occhiata a questo. – user1105045