Проверка утверждения о том, что что-то не должно компилироваться
Когда я'я работаю с библиотеками, которые поддерживают программирование на уровне типов, я часто пишу комментарии, подобные следующим (изпример представленныйПол Снайвли на Странной Петле 2012):
// But these invalid sequences don't compile:
// isValid(_3 :: _1 :: _5 :: _8 :: _8 :: _2 :: _8 :: _6 :: _5 :: HNil)
// isValid(_3 :: _4 :: _5 :: _8 :: _8 :: _2 :: _8 :: _6 :: HNil)
Или это изпример вбесформенный репозиторий:
/**
* If we wanted to confirm that the list uniquely contains `Foo` or any
* subtype of `Foo`, we could first use `unifySubtypes` to upcast any
* subtypes of `Foo` in the list to `Foo`.
*
* The following would not compile, for example:
*/
//stuff.unifySubtypes[Foo].unique[Foo]
Это очень грубый способ указать на некоторые факты о поведении этих методов, и мы можем представить, что хотим сделать эти утверждения более формальными -для блочного или регрессионного тестирования и т. д.
Чтобы привести конкретный пример того, почему это может быть полезно в контексте такой библиотеки, как Shapeless, несколько дней назад я написал следующее в качестве быстрой первой попытки ответа наэтот вопрос:
import shapeless._
implicit class Uniqueable[L