Я пытался расшифровать, что это на самом деле означаетдекодирования scalacheck и scalatest код
check { (n: Int) =>
n > 1 ==> n/2 > 0
}
из http://www.scalatest.org/user_guide/writing_scalacheck_style_properties
Я первый пытается расшифровать ли это тело
((n: Int) => n > 1) ==> n/2 > 0
or
(n: Int) => (n > 1 ==> n/2 > 0)
Какой бы это будет? Я угадываю последнее, поскольку метод check принимает функцию, хотя метод '==>' может также возвращать функцию?
Далее я смотрю на метод проверки подписи на https://searchcode.com/codesearch/view/12336175/
def check[A1,P](f: A1 => P)
(implicit
p: P => Prop,
a1: Arbitrary[A1], s1: Shrink[A1]
) {
check(Prop.property(f)(p, a1, s1))
}
Я считаю, что A1 будет вполне Int, если ==> возвращает функцию и изменяет тип возврата (сомнительно, хотя я думаю). Я не уверен, как найти неявную функцию P => Prop в библиотеке scalacheck.
Я замечаю есть ExtendedBoolean, который имеет функцию ==>https://github.com/rickynils/scalacheck/blob/master/src/main/scala/org/scalacheck/Prop.scala
Возможно (п> 1) превращали в ExtendedBoolean предполагая, что функция была (п: Int) => (п> 1 = => п/2> 0), а затем мы получаем
ExtendedBoolean(n > 1).==>(n/2 > 0) is called then.
Поскольку реализация ==> для ExtendedBoolean является Проп (б) ==> р, я в конечном итоге с
Prop(n > 1) ==> (n/2 > 0)
I получить действительно con сливаются здесь, как при вызове по имени, значения обычно фиксируются, за исключением того, что в этой точке нет значения для n, поскольку оно первоначально было функцией. игнорируя мое замешательство на секунду, реализация ==> для Prop Таким образом
def ==>(p: => Prop): Prop = flatMap { r1 =>
if(r1.proved) p map { r2 => mergeRes(r1,r2,r2.status) }
else if(!r1.success) Prop(r1.copy(status = Undecided))
else p map { r2 => provedToTrue(mergeRes(r1,r2,r2.status)) }
}
так, мы называем это как так я думаю, с другой неявной версии подпирать здесь
Prop(n > 1) ==> Prop(n/2 > 0)
нормально, и плоская карта
Prop(prms => f(this(prms))(prms))
Хм, должно быть, было другое обращение к Проп. Я начинаю отслеживать СУРП, а затем посмотреть на объект проп применить метод Booleans, который
def apply(b: Boolean): Prop = if(b) proved else falsified
, но я не могу решить б к истинным или ложным, поскольку эти функции не были оценены еще. Как все это работает вместе? Я думаю, что я просто пропустил несколько концепций. Может кто-нибудь объяснить это немного лучше?
У вас ничего не пропало. ExtendedBoolean оценивает параметр по имени [def ==> (p: => Prop) = Prop (b) ==> p] (https: // github.ком/rickynils/scalacheck/блоб/ведущий/SRC/Основной/Scala/орг/scalacheck/Prop.scala # L318). «По аргументу имени не оценивается в точке приложения-функции, а вместо этого оценивается при каждом использовании внутри функции. То есть аргумент оценивается с помощью вызова по имени». – Jamil
Я привык называть log4scala, где log.debug (=> String) принимает что-то вроде log.debug («hi there» + name) и имя IS уже определено. В этом случае по имени получает что-то, где имя еще не определено. Возможно ли это? в случае log.debug он фиксирует значение имени в закрытии в случае, если закрытие будет оцениваться позже (и это может быть не так), но я не понимаю его в контексте этого выше кода. –