Есть ли функция, чтобы проверить, существует ли элемент в списке? - PullRequest
0 голосов
/ 07 октября 2018

В ракетке мне известна функция member, которая возвращает первое вхождение элемента, если он существует, или #f в противном случае, но есть ли функция, которая просто возвращает #t или #f дляэлемент существует в списке?

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

Ответ на этот вопрос member.В Racket все, что не #f, является правдой.Следовательно, member прекрасно работает для проверки наличия элемента в списке:

> (if (member 3 '(1 2 3)) 'present 'absent)
'present
> (if (member 3 '(1 2)) 'present 'absent)
'absent

Нет необходимости специально генерировать #t при успехе, потому что все в Racket, которое разветвляется, заботится только о #f и не- #f значения.

В некоторых редких случаях вам действительно нужно логическое значение, например, если вы собираетесь сохранить результат в некоторой структуре данных и не хотитесохранить ненужную ссылку на список.Обычная идиома для этого в Racket - (and v #t), где v - некоторое значение, поскольку это эквивалентно написанию (if v #t #f).Следовательно, вы можете просто окружить свой вызов member следующим текстом:

> (and (member 3 '(1 2 3)) #t)
#t

Поскольку это крайне редко необходимо, в Racket это более идиоматично, чем написание отдельной функции member?.

0 голосов
/ 07 октября 2018

Я не думаю, что есть стандартная функция для этого, но посмотрите true? и without-truthiness в предикатах library.

Определить true? довольно просто:

(define (true? x)
    (if x #t #f))
...