Я рассматриваю перенос очень простой библиотеки текстовых шаблонов для scala, в основном как упражнение в изучении языка. Библиотека в настоящее время реализуется как в Python и JavaScript, и его основные операции более или менее сводится к этому (в Python):Как указать тип неструктурированных данных JSON в Scala?
template = CompiledTemplate('Text {spam} blah {eggs[1]}')
data = { 'spam': 1, 'eggs': [ 'first', 'second', { 'key': 'value' }, true ] }
output = template.render(data)
Все это ужасно трудно сделать в Scala, но что я» m неясно о том, как наилучшим образом выразить статический тип параметра data
.
В основном, этот параметр должен содержать типы вещей, которые вы найдете в JSON: несколько примитивов (строки, ints, boolean, null) или списки с нулевым или большим количеством элементов или карты с нулем или более Предметы. (Для целей этого вопроса карты могут быть ограничены наличием строковых ключей, что похоже на то, как Scala все равно любит.)
Моя первоначальная мысль состояла в том, чтобы использовать Map[string, Any]
как объект верхнего уровня, но это не кажется мне совершенно правильным. На самом деле я не хочу добавлять в него произвольные объекты любого класса; Я хочу только элементы, описанные выше. В то же время, я думаю, что в Java ближе всего я бы смог получить Map<String, ?>
, и я знаю, что один из авторов Scala разработал дженерики Java.
Мне особенно любопытно, как другие функциональные языки с похожими типами систем справляются с такой проблемой. У меня такое ощущение, что то, что я действительно хочу здесь сделать, придумал набор классов case, с которыми я могу сопоставлять шаблоны, но я не совсем в состоянии представить, как это будет выглядеть.
У меня есть Программирование в Scala, но если честно, мои глаза начали остекление над немного в ковариационной/контравариации вещи и я надеюсь, что кто-нибудь может объяснить мне это немного более четко и лаконично.
Спасибо, это было именно то, что я искал. Каков источник переписанного парсера JSON, с которым вы связаны, на пастебине? (Я заметил, что встроенный парсер в библиотеках Scala использует Map [String, Any].) –
Я написал парсер, связанный с пастебином. Я имел в виду сделать из него полноценный проект, но не нашел времени. –