Фон
Я работаю с библиотекой Aeson для хранения и извлечения значений из файла. Я использую Typeable
(и TypeRep
s) для маркировки данных, поэтому у меня есть довольно хорошее представление о том, что они будут правильно анализироваться.
У меня есть класс, в котором каждый член класса имеет функцию, которая занимает время (Integer
) и обновляется, т.е.:
class Update a where
update :: Integer -> a -> a
Все значения, хранящиеся в файле, являются экземплярами класса Update
.
Вопрос Я хочу перебрать файл, update
обозначив каждое значение, и записать новый файл. Я хотел бы, чтобы программа во время выполнения определяла тип данных фрагмента данных, использовала fromJSON
для создания значения этого типа, запускала для него update
и записывала его обратно. Средство проверки типов думает, что это ужасная идея, потому что оно не может статически проверить тип вызова fromJSON во время компиляции и, следовательно, не может получить правильную запись из словаря класса Update
.
Есть ли способ использовать Typeable (или Data), чтобы заставить средство проверки типов делать правильные вещи? Есть ли лучшая альтернатива?
Моя единственная мысль о том, как обойти это, - создать тип данных объединения всех обновляемых типов, а затем использовать оператор case для анализа тега и выбора правильного конструктора. Я не очень доволен этим решением, потому что я не могу добавлять новые типы в класс обновления, не касаясь этого типа объединения.
Update
во время выполнения. Этого нельзя добиться, я думаю. - person chi   schedule 12.08.2017