Как проверить, что список содержит только #t - PullRequest
7 голосов
/ 02 мая 2011

Я пытался с помощью следующего кода в ракетке и схеме MIT, удивите меня, что компилятор сгенерировал ошибку

(foldr and #t '(#t #t #f))

Есть ли какой-нибудь способ использовать метод уменьшения / сворачивания, чтобы проверить, что список содержит только trueили ложь?Я знаю, что лямбда может сделать эту работу, но это действительно заставляет задуматься, почему это неверный код.Я помню, я могу сделать это на Хаскелле .....

TIA.

Ответы [ 4 ]

8 голосов
/ 02 мая 2011

and - макрос, поэтому он не имеет значения сам по себе.В частности, это приводит к короткому замыканию оценки, и использование его, как вы пытались, не будет иметь никакого смысла.По этой причине Racket имеет andmap, который вы можете использовать в таких случаях.(Другие реализации имеют аналогичные функции под другими именами - например, srfi-1 использует every.)

7 голосов
/ 03 мая 2011

А является макросом и не может использоваться как функция. Поместите это в функцию:

(foldr (lambda (a b) (and a b)) #t '(#t #t #f))

1 голос
/ 20 мая 2011

Единственное, что может быть не так, это то, что в Racket и Scheme истинные значения отличаются от #f.Поскольку ваш вопрос требует логических выражений, следующее будет более разборчивым:

#lang racket
(define (boolean-true? x) (eq? x #t))
(define (only-contains-#t? l)
  (andmap boolean-true? l))

Например,

> (only-contains-#t? '())
#t
> (only-contains-#t? '(#t #t #t))
#t
> (only-contains-#t? '(#t #t true))
#f
1 голос
/ 02 мая 2011

Это работает в хитрости:

(primitive-eval (cons 'and '(#t #f)))
...