4

リスト内のすべての要素が整数であるかどうかをどのように確認しますか?(integer?(car list)を使用して最初の要素を確認できますが、(integer?(cdr list))を使用すると、リストの最後の部分全体が整数ではないため、常にfalse(#f)が返されます。グループとして。この場合、リストが次のように定義されているとします。(リストの定義'(1 2 5 4 5 3))

4

4 に答える 4

3
  (define get-integers
    (lambda (x)
     (if (null? x)
        "All elements of list are integers"
        (if (integer? (car x))
            (get-integers (cdr x))
            "Not all elements are an integer"))))
于 2012-07-23T21:57:39.590 に答える
2

実用的なスキームは、シーケンス全体にわたってテストを実行するための関数を提供します。たとえば、andmap関数の適用が適切です。ラケットは、同様のことを行うための/およびを提供します。本当に手動でループを書き出す必要がある場合は、再帰を使用します。

于 2012-07-23T21:18:28.907 に答える
2

リスト内の各要素をテストして、条件(この場合は整数)を満たしているかどうかを確認する必要があります。整数のリストを評価するときは(integer? (car list))、リストの最初の要素が整数であるかどうかをチェックしていますが、それで問題ありません。ただし、式はリストが整数である(integer? (cdr list)) かどうかをテストし(リストを返すため)、それは機能しません。リストの次の要素をテストする必要があり、リストが空になるまで次の要素をテストする必要があります。cdr

上記を行うにはいくつかの方法があります。最も簡単な方法は、リストを繰り返して各要素を順番にテストしfalse、非整数要素が見つかったtrue場合、またはすべてのリストが非整数要素を見つけずに消費された場合に返すことです。これ:

(define (all-integers? lst)
  (cond ((null? lst) #t)
        ((not (integer? (car lst))) #f)
        (else (all-integers? (cdr lst)))))

より実用的なアプローチは、次のような組み込みの手順を使用することです。

(andmap integer? lst)

andmapのすべての要素が指定された述語に対してlst評価されるかどうかをチェックします。true例えば:

(andmap integer? '(1 2 3))
> #t

(andmap integer? '(1 "x" 3))
> #f
于 2012-07-23T21:30:16.430 に答える
1

SRFI-1は、everyandanyではなくandmapandという用語を使用しormapます。match使用することもできます:

(define list-of-integers?
  (lambda (lst)
    (match lst
           (((? number?) ..1) #t)
           (_ #f))))
于 2016-04-12T12:45:28.960 に答える