リスト内の 1 の数を使用foldrして検索する方法を見つけました。lambdaただし、if条件またはその他の方法を使用して、リストに 1 しかないかどうかを確認する方法.
(define (exactlyone L)
(foldr (lambda (elem count) (if (equal? elem 1) (+ count 1) count))
0 L)
)
count可能であれば、if 条件で値を使用するにはどうすればよいですか?
1すべてのリストをトラバースするまで sの数を確認できないため、必然的にfoldrすべてのアイテムを消費する必要があります。その後、の戻り値がcountだったかどうかをテストするのは簡単なことです1:
(define (exactlyOne L)
(= 1
(foldr (lambda (elem count)
(if (equal? elem 1)
(+ count 1)
count))
0
L)))
もちろん、最も簡単な方法は、count一からやり直すのではなく、既存の手順 ( など) を使用することです。これはRacketで機能します:
(define (exactlyOne lst)
(= 1
(count (curry equal? 1) lst)))
例えば:
(exactlyOne '(1 2 3))
=> #t
(exactlyOne '(1 2 3 1))
=> #f