主に言語学習の演習として、非常に単純なテキスト テンプレート ライブラリを 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)、または 0 個以上のアイテムのリスト、または 0 個以上のアイテムのマップ。(この質問の目的のために、マップは文字列キーを持つように制限することができます。これは、とにかく Scala が好きな方法のようです。)
私の最初の考えは、Map[string, Any]
a をトップレベルのオブジェクトとして使用することだけでしたが、それは私には完全に正しいとは思えません。実際、そこにあらゆる種類のクラスの任意のオブジェクトを追加したくありません。上記で概説した要素のみが必要です。同時に、Java で実際に取得できる最も近いものは だと思いますMap<String, ?>
。また、Scala の作成者の 1 人が Java のジェネリックを設計したことも知っています。
私が特に興味を持っていることの 1 つは、同様の型システムを持つ他の関数型言語がこの種の問題をどのように処理するかということです。ここで本当にやりたいことは、パターン マッチングが可能な一連のケース クラスを考え出すことだと思いますが、それがどのようになるかはまったく想像できません。
私はScalaでのプログラミングを持っていますが、正直なところ、私の目は共分散/反分散のものに少し目がくらみ始めました。誰かがこれをもう少し明確かつ簡潔に説明してくれることを願っています.