のような単一のアイテムをテストする述語が与えられた場合、リストのすべての要素が述語を満たすかどうかをテストするためpositive?
のバージョンを作成しようとしていますall-are
元:
((all-are positive?) '(1 2 3 4)) => #t
((all-are even?) '(2 4 5 6 8)) => #f
all-are
引数として述語を取り、要素のリストに適用できる新しい関数を返す必要があります
これは、既存のプロシージャーで表現するのは非常に簡単です: - これは、指定された述語がリスト内のすべての要素に適用されたときに、それらすべてについて true と評価された場合にandmap
返します。#t
(define ((all-are predicate) lst)
(andmap predicate lst))
関数を返さなければならないという質問があるため、カリー化されたプロシージャを返すために少し構文糖衣を使用しています。期待どおりに動作します:
((all-are positive?) '(1 2 3 4))
> #t
((all-are even?) '(2 4 5 6 8))
> #f
私のソリューションのように既存の手順を使用するのではなく、最初から手順を実装する必要があると思います。上記の短いバージョン (何をする必要があるかについての一般的な考え方を示しています) を、基本的な形式のみを使用してより単純なものに変えることをお勧めします。これはおそらく、教師が期待していることです。
「foldr」の基本のみを使用しようとすると、コードは次のようになります。
(define (all-are pred l)
(foldr (λ (x y)
(and y (pred x))) #t l))
foldr、foldl、およびその他の基本を使用して、必要なパラメーターを見つけてみてください。これは、プログラミングの良い練習になります....お役に立てば幸いです!!!