Раньше я использовал идиому, подобную следующей, для создания классов case с помощью 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», но я надеюсь, что у кого-то появится хорошая идея.