我正在考虑将一个非常简单的文本模板库移植到 scala,主要是作为学习语言的练习。该库目前在 Python 和 Javascript 中实现,其基本操作或多或少归结为这一点(在 python 中):
template = CompiledTemplate('Text {spam} blah {eggs[1]}')
data = { 'spam': 1, 'eggs': [ 'first', 'second', { 'key': 'value' }, true ] }
output = template.render(data)
在 Scala 中,这些都不是很难做到的,但我不清楚的是如何最好地表达data
参数的静态类型。
基本上,此参数应该能够包含您在 JSON 中找到的各种内容:一些原语(字符串、整数、布尔值、null),或者零个或多个项目的列表,或者零个或多个项目的映射。(出于这个问题的目的,可以将映射限制为具有字符串键,这似乎是 Scala 无论如何都喜欢的东西。)
我最初的想法只是将 aMap[string, Any]
用作顶级对象,但这对我来说似乎并不完全正确。事实上,我不想在其中添加任何类型的任意对象;我只想要我上面概述的元素。同时,我认为在 Java 中我真正能够得到的最接近的是Map<String, ?>
,而且我知道 Scala 的作者之一设计了 Java 的泛型。
我特别好奇的一件事是其他具有类似类型系统的函数式语言如何处理此类问题。我有一种感觉,我在这里真正想做的是提出一组我可以进行模式匹配的案例类,但我不太能够想象它会是什么样子。
我有Programming in Scala,但老实说,我的眼睛开始对协变 / 逆变的东西有点呆滞,我希望有人能更清楚、更简洁地向我解释这一点。