ScalaCheck でケース クラスを生成するために、次のようなイディオムを使用していました。
GenSomething.map2(GenSomethingElse)(MyClass(_, _))
最近、ScalaCheck を 1.11 にアップグレードし、mapN
メソッドを削除しました。各フィールドのジェネレーターに中間名を割り当てる必要がないようにしたいのですが、mapN
メソッドはそれを行う最も簡単な方法を提供しました。現在、最適な構文は次のとおりです。
for {
something <- GenSomething
somethingElse <- GenSomethingElse
} yield MyClass(
something = something,
somethingElse = somethingElse)
それはそれほど悪くはありません (構造体はコンストラクターの引数の数が少ないため)、ここで特別なことは何も行われていないことを明確にしたいと思います。リーダーなしで各引数のジェネレーターを指定しているだけですそれを確認するためにコードを読む必要があります。
要するに、アプリケーション構文に似たものが欲しいのです。残念ながら、scalaz、shapeless、またはマクロを使用するオプションはありません。この最後の文は、「X を実行できるものにアクセスせずに X を実行するにはどうすればよいか」という私の疑問をほとんど引き起こしていることは理解していますが、誰かが良い考えを持っていることを願っています。