2014-10-02 3 views
1

Я пытался расшифровать, что это на самом деле означаетдекодирования 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 

, но я не могу решить б к истинным или ложным, поскольку эти функции не были оценены еще. Как все это работает вместе? Я думаю, что я просто пропустил несколько концепций. Может кто-нибудь объяснить это немного лучше?

+0

У вас ничего не пропало. ExtendedBoolean оценивает параметр по имени [def ==> (p: => Prop) = Prop (b) ==> p] (https: // github.ком/rickynils/scalacheck/блоб/ведущий/SRC/Основной/Scala/орг/scalacheck/Prop.scala # L318). «По аргументу имени не оценивается в точке приложения-функции, а вместо этого оценивается при каждом использовании внутри функции. То есть аргумент оценивается с помощью вызова по имени». – Jamil

+0

Я привык называть log4scala, где log.debug (=> String) принимает что-то вроде log.debug («hi there» + name) и имя IS уже определено. В этом случае по имени получает что-то, где имя еще не определено. Возможно ли это? в случае log.debug он фиксирует значение имени в закрытии в случае, если закрытие будет оцениваться позже (и это может быть не так), но я не понимаю его в контексте этого выше кода. –

ответ

0

Ваш действительно ScalaCheck вопрос, но один из способов избежать весь вопрос заключается в использовании ScalaTest в PropertyChecks синтаксис вместо ScalaCheck (который поддерживается в ScalaTest по шашкам):

import org.scalatest.prop.Checkers._ 

check { (n: Int) => 
    n > 1 ==> n/2 > 0 
} 

становится:

import org.scalatest.MustMatchers._ 
import org.scalatest.prop.PropertyChecks._ 

forAll { (n: Int) => 
    whenever (n > 1) { 
    n/2 must be > 0 
    } 
} 
+0

спасибо за ответ, но я не пытаюсь избежать вопроса. Я пытаюсь увеличить свои знания о scala. Я привык накладывать, как на log.debug (=> String), где я могу передать имя «мое имя» +, а имя записывается как «декан» или что-то в этом роде. В приведенном выше примере scalacheck n еще не имеет значения. Вы действительно можете разделить функцию на закрытие, которое может быть оценено позже? или я неправильно читаю код. –