Монотонный `Произвольный [A => A]`
В скаляре, как бы вы пошли на реализацию Arbitrary
что возвращает только монотонные функции?
Я пытался с помощью suchThat
в варианте
def monotonicArbitrary [A : Arbitrary : Cogen : Ordering] : Arbitrary[A => A] = Arbitrary {
arbitraryFn1[A,A].arbitrary suchThat {f =>
val monotonic = forAll { (aa : (A,A)) => { aa._1 > aa._2} == { f(aa._1) > f(aa._2) } }
check(monotonic).passed
}
}
Но это терпит неудачу, потому что генераторы по умолчанию создают негладкие функции, я полагаю.
Я бы принял ответы где A
ограничено быть Numeric
или аналогичный (иначе не уверен, как вы будете генерировать гладкие функции).
Это не может быть тривиальной реализацией, т.е. всегда возвращать одну и ту же функцию.