2016-11-07 34 views
2

我一直在試圖創建一個子集?,成員?以及使用預定義的濾波函數和地圖函數(ormap,andmap)的一些變體的相交函數。方案 - 如果使用'map/filter'中的函數,如果它有多個參數?

「會員?」函數應該檢查一個元素是否是列表的成員:

(define member? 
(lambda (e s) 
    (ormap (curry same-elem? e) s))) 

它使用一個名爲「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))))) 

「subset?」檢查是否在一組中的元素是另一組的一部分:

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

在「相交」功能應該返回兩個集合的交集:

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

原因我使用的「咖喱'函數是因爲我試圖在此stackoverflow線程中遵循解決方案:Scheme/Racket filter/map multiple arguments試圖將第二個參數傳遞到我調用的函數中。它雖然不起作用。

每當我調用這些函數中的任何一個時,它都會輸出一個錯誤消息,說明我的成員在我的ormap調用中需要一個列表?功能,但有一個元素。奇怪的部分是我的成員?功能工作正常,直到像幾分鐘前......我甚至沒有碰過任何東西!

我是一個在編程方面的新手,我對Scheme完全陌生。如果map/filter中的被調用函數只有一個參數,我知道如何使用map/filter函數......但是如果我有多個參數,該怎麼處理呢?請幫忙。

編輯:我下面選擇的解決方案不適用於咖喱。但是,如果您刪除咖喱功能並編寫匿名函數,它確實可行。

像這樣:

(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

這是一樣的,它只是當你使用匿名函數,你指定參數的順序,但咖喱強制命令是在一個固定的辦法 –

相關問題