> On Fri, Jul 15, 2016 at various times, various people said:
>  Here, let me solve your problem


You guys are great.  Thank you very much.

Dave

On Fri, Jul 15, 2016 at 12:47 PM, Daniel Feltey <dfel...@ccs.neu.edu> wrote:
> Here's a version that uses a #:pre condition:
>
> #lang racket
>
> (define/contract (tau l m)
>   (->i ([list1 (listof (and/c exact-integer? (>/c 0)))]
>         [list2 (listof (and/c exact-integer? (>/c 0)))])
>        #:pre (list1 list2) (= (length list1) (length list2))
>        [_ number?])
>   (begin
>     (println "I was called")
>     300))
>
> (tau '(8) '(9))   ;; this succeeds
> (tau '(8) '(9.0)) ;; this doesn't satisfy the contract anymore
> (tau '(8) '(9 10)) ;; neither does this
>
> For differentiating between integers like 9 and 9.0, the predicate you want
> to use is `exact-integer?`. The `integer?` predicate accepts both exact and
> inexact integers which can be a little strange at first.
>
> Dan
>
>
>
> On Fri, Jul 15, 2016 at 11:22 AM, David Storrs <david.sto...@gmail.com>
> wrote:
>>
>> Hi folks,
>>
>> I'm writing a stats library (I'm sure there is already one out there;
>> this is a learning exercise), and I'm currently implementing Kendall's
>> Tau-a.  I've got my head wrapped part of the way around contracts, but
>> not all the way.  I'd like to be able to express the following:
>>
>> (tau l m)
>> - l is a non-empty list of numbers, all greater than 0
>> - m is a non-empty list of numbers, all greater than 0
>> - l and m are of the same length
>>
>> Here's a stub version that does the first two checks:
>>
>> (define/contract (tau l m)
>>   (-> (listof (and/c integer? (>/c 0)))
>>       (listof (and/c integer? (>/c 0)))
>>       number?)
>>   300)
>>
>> (tau '(8) '(9))    ;; should succeed and does
>> (tau '(8) '(9.0))  ;; should fail (element is not integer) => SUCCEEDS??
>> ;;
>> ;; not implemented
>> ;; (tau '(8) '(9 10)) ;; should fail -- different length lists
>>
>>
>> I figured I'd let the 'integer?' failure go for a minute and focus on
>> the missing criteria (lists are of equal length).  First, I wanted to
>> make sure that I had understood the ->i syntax, so I did this:
>>
>> (define/contract (tau l m)
>>   (->i ([list1 (listof (and/c integer? (>/c 0)))]
>>         [list2 (list1) (and/c
>>                         (listof (and/c integer? (>/c 0))))])
>>
>>        [result (list1 list2) number?])
>>   300)
>>
>> Okay, good, that has the same results as the one above.  Now let's try
>> to get the 'equal length' criteria working.
>>
>> (define/contract (tau l m)
>>   (->i ([list1 (listof (and/c integer? (>/c 0)))]
>>         [list2 (list1) (and/c
>>                         (listof (and/c integer? (>/c 0)))
>>                         (equal? (length list1) (length list2)))])
>>
>>        [result (list1 list2) number?])
>>   (begin
>>     (println "I was called")
>>     300))
>>
>> Result =>
>> t.rkt:21:79: list2: unbound identifier in module
>>   in: list2
>>
>> Nope.  Unsurprisingly, 'arg2' is not available inside its own binding.
>>
>>
>> At this point I faffed around with implementing the check as a
>> precondition or in the result function, and everything else I could
>> think of, all to no avail.
>>
>>
>> How do I do this?  It feels like it shouldn't be this hard.
>>
>>
>> On a separate question:  How do I contribute to the docs?  The
>> contract docs are nearly silent on using preconditions and
>> postconditions, Section 7.4, "A Thorough Example of Contracts" is
>> anything but thorough, and the docs could stand to include more
>> examples in general.  I'd love to help future Racket students
>> understand what's going on.
>>
>>
>> Dave
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Racket Users" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to racket-users+unsubscr...@googlegroups.com.
>> For more options, visit https://groups.google.com/d/optout.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to