Я хочу добиться чего-то похожего на ограниченные массивы в пакете стандартных массивов, но используя репа-массивы.
Какой хороший и чистый способ достичь этого?
Это то, что я пробовал, но должен быть лучший способ, чем обернуть все в пользовательских функциях, которые проверяют границы:
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)))
Также я попытался получить экземпляр Shape для (sh:. C), но безрезультатно, я не могу понять, как реализовать некоторые из интерфейсов, объявленных в классе Shape для моего типа данных, Я пишу вопрос с надеждой, что у кого-то есть способ, но если нет, я попробую еще раз. Спасибо!