On Fri, Oct 28, 2011 at 2:04 PM, Joe Marshall <jmarsh...@alum.mit.edu> wrote:
> On Fri, Oct 28, 2011 at 10:58 AM, Stephen Bloch <sbl...@adelphi.edu> wrote:
>>
>> OK, here's a variant of "binary->nary" that produces the results we want 
>> when "op" has contract "X X -> boolean" rather than "X X -> X"
>>
>> (define (binary->nary relop)
>>   (letrec ((f (lambda args
>>                 (or (empty? args)
>>                     (empty? (rest args))
>>                     (and (relop (first args) (second args))
>>                          (apply f (rest args)))))))
>>     f))
>>
>> This applies relop to each successive (overlapping) pair of elements and 
>> "and"s the results.
>
> Yes!  Thank you!
>
> Of course this fails for n-ary add and multiply, but presumably a
> person who preferred
> this generalization would have to answer the dual question of the
> original poster:
> Why do the relational operators generalize to 0 or 1 arguments but addition 
> and
> multiplication do not?

You seem to be assuming that we have to pick one binary->nary for all
binary operators.  I would choose this one for relations and the other
one for associative operators with identities.  Other kinds of
operators may have other kinds of natural generalizations.

--Carl

_________________________________________________
  For list-related administrative tasks:
  http://lists.racket-lang.org/listinfo/users

Reply via email to