Неясно, является ли «правильный» вход для процедуры произвольным списком или двухэлементным списком. Если это строго список двухэлементного, это будет работать:
(define (is-two-element-list? lst)
(and (list? lst)
(= (length lst) 2)))
(define (zipper? lst)
(and (is-two-element-list? lst)
(is-two-element-list? (first lst))
(is-two-element-list? (second lst))))
... И если это список произвольной длины, элементы которого мы хотим проверить, что это будет работать в рэкете, используя andmap
:
(define (zipper? lst)
(andmap is-two-element-list? lst))
Если вы не используете рэкет, то это решение с помощью every
будет работать в любом переводчика с SRFIs:
(require srfi/1)
(define (zipper? lst)
(every is-two-element-list? lst))
в любом случае, обратите внимание, что трюк был defin в процедуре is-two-element-list?
, которая проверяет свойство двух элементов, после чего мы можем применить его по мере необходимости.
Вы хотите, чтобы проверить, есть ли список ровно два элемента (что вы говорите) или содержит ли список только списки два-элементов (которые ваш второй пример, кажется, подразумевает? – molbdnilo
Мой ответ принимает во внимание оба случаи, упомянутые @molbdnilo, который был правильным? и не забудьте принять его;) –