2016-11-07 2 views
2

私はサブセットを作成しようとしていますか、メンバーですか?事前定義されたフィルタ関数とマップ関数(またはマップ、マップ)のいくつかのバリエーションを使用して、交差関数を計算します。Scheme - 複数の引数を持つ場合、 'map/filter'で関数を使用するにはどうすればよいですか?

"member?"関数は、ある要素がリストのメンバーであるかどうかをチェックすることになっています: "same-elem?"という関数を使っていますか?

(define same-elem? 
(lambda (e1 e2) 
    (cond ((and (set? e1) (set? e2)) (same-set? e1 e2)) 
     ((and (number? e1) (number? e2)) (= e1 e2)) 
     (else (equal? e1 e2))))) 

「サブセット?」は、次のようになります。チェック1セット内の要素は、別のセットの一部である場合:「交差点」関数は、2組の交差点を返すことになっている

(define subset? 
(lambda (s2 s1) 
    (andmap (curry member? s2) s1))) 

(define intersection 
(lambda (s2 s1) 
    (filter (curry member? s2) s1))) 

理由私は「カレーを使用しています'関数は、このスタックオーバーフロースレッドの解決策に従おうとしたためです:Scheme/Racket filter/map multiple arguments私の呼び出された関数に第2引数を渡そうとしています。しかし、それは動作しません。

これらの関数のいずれかを呼び出すと、メンバーのmy ormapコールのリストを期待しているというエラーが出力されます。関数が要素を持っています。奇妙な部分は私のメンバーですか?関数は2〜3分前までうまくいきました...私は何かに触れていません!

私はプログラミングの初心者です。私は全くSchemeを初めて使っています。 map/filterの呼び出された関数に引数が1つしかない場合は、マップ/フィルタ関数を使用する方法を知っています...しかし、複数の引数を持つ場合、これをどうやって処理しますか?助けてください。

編集:私が以下で選んだ解決策は、カレーでは機能しません。しかし、カリー関数を削除して、代わりに無名関数を書くとうまくいきます。このよう

(define member? 
(lambda (e s) 
    (ormap (lambda (x) 
      (same-elem? e x)) s))) 
+0

手続き '同じセット'あなたは 'セット等しいを意味した' –

+0

同じセットを、定義されていませんか?定義されていません。私はポストに追加するのを忘れてしまった。 – Schytheron

答えて

1

あなたのアプローチは、あなただけのパラメータの順序に注意する必要が正しいです - あなたがしたい場合たとえば、member?はその最初パラメータとしてセットを受けるべきですandmapは、結果として得られるlambdaフォームに個の要素を渡すので、それをカレーします。また、使用されている高次手順では、がパラメータとしてをリストしていることに注意してください。には、setデータ型のが設定されています。これは私が何を意味するかです:

; tests if `e` is a member of `s` 
(define member? 
    (lambda (s e) 
    (ormap (curry same-elem? e) s))) 

; tests if `s1` is a subset of `s2` 
(define subset? 
    (lambda (s1 s2) 
    (andmap (curry member? s2) s1))) 

; finds the intersection of `s1` and `s2`  
(define intersection 
    (lambda (s1 s2) 
    (filter (curry member? s1) s2))) 

期待通りに彼らが働く:??

(member? '(a b c d e) 'c) 
=> #t 
(subset? '(c d) '(a b c d e)) 
=> #t 
(intersection '(c d b a) '(a x y b)) 
=> '(a b) 
+0

それは仕事の種類。カレーを使わないでください。しかし、私がカレーを取り除いて無名の関数を書いたのでは... – Schytheron

+0

無名関数を使うときはパラメータの順番を指定しますが、カレーを使うと命令は固定された状態になります方法 –

関連する問題