2

これは宿題です:

与えられた述語を満たす与えられたリストのすべての要素を含むリストを返します。例えば、

(filter (lambda (x) (< x 5)) '(3 9 5 8 2 4 7)) 

(3 2 4) を返す必要があります。

昨日スキームを始めたばかりなので、完全な初心者です。この関数関数呼び出しの構文を正しく理解していれば、"filter" が関数で、"(lambda (x) (< x 5)" が引数です。これは Java の無名関数に似ていますか?

編集:

stackoverflow の別の投稿からいくつかのコードを見つけました。彼らはただまっすぐに質問に答えました:これが彼らが書いたものです:

   (define (my-filter pred lst)
     (cond ((null? lst) null)
       ((pred (first lst))
          (cons (first lst) (my-filter pred (rest lst))))
       (else (my-filter pred (rest lst)))))

これは良いことであり、機能しますが、使用する前に理解したいと思います。「pred」は関数ですが、この例では (< x 5) を渡しており、何らかの形でこの値を受け入れています。わからないこと。

このプログラムで何が起こるか説明してもらえますか? 何が起こっているかの背後にあるロジックがわかりません。

4

4 に答える 4

5

他の答えはスポットオンです。さらに、参考になれば、このプログラムは同じことを意味します。

#lang racket

(define (less-than-five x) (< x 5))

(filter less-than-five '(3 9 5 8 2 4 7))

ここでのScheme/RacketとJavaの主な違いは、

less-than-five

値です。Java では、メソッドは値ではありません。

編集:質問にたくさん追加したようです。あなたが得たものをただ取るのではなく、フォローアップの質問があることに感銘を受けました:)

これに答える最善の方法は、関数呼び出しを行ったときに何が起こるかに注目し、ステッパーを使用することだと思います!

なんてこった。私はビデオを作成し、YouTube に投稿しました。

http://youtu.be/2hmamosiqGI

于 2012-04-27T01:43:20.407 に答える
1

はい、関数を呼び出しておりfilter、その引数の 1 つが です(lambda (x) (< x 5))。(そして、別の引数があります。数字のリストです。) はい、これは、Java の単一のメソッドを持つ無名クラスに非常によく似ています。

于 2012-04-27T01:26:35.113 に答える
1

はい、lambdaスキームで関数を定義します。関数が名前で変数に割り当てられていない場合、それは基本的に無名関数と同じです。

于 2012-04-27T01:27:12.073 に答える
0

Google の Guava ライブラリを使用した Java の問題の簡単な例を次に示します。

Iterables.filter(asList(3,9,5,8,2,4,7), new Predicate<Integer>() {

    @Override
    public boolean apply(Integer a) {
        return a < 5;
    }

});

Java には無名関数ではなく、無名クラスがあることを示すために取り上げます。Java には、ファースト クラスのデータ型としての関数はありません。あなたがコースを受講している場合(そうであると思います)、これはテストで尋ねられる可能性が非常に高いためです。

于 2012-04-27T01:44:58.780 に答える