2015-10-18 20 views
0

我正在構建一個接受一組整數的函數,並返回奇數整數的子集。我遇到了問題,我需要跳過映射中的整數,但現在我的函數返回#<void>計劃在lambda圖中跳過或繼續

(define (oddSubset set) 
    (map 
    (lambda (x) 
     (cond 
     ((odd? x) x))) 
    s)) 

在使用中:

> (oddSubset '(1 2 3)) 
'(1 #<void> 3) 

是否有邏輯,我可以使用像 「否則,繼續到下一個元素」?

注:我想重寫內置的過濾器功能

回答

2

map沒有跳過的可能性,但你可以使用filter代替:

(filter odd? '(1 2 3 4 5 6)) ; ==> (1 3 5) 

或者你可以使用fold-right

(fold-right (lambda (e acc) 
       (if (odd? e) 
        (cons e acc) 
        acc)) 
      '() 
      '(1 2 3 4 5 6)) ; ==> (1 3 5) 

我認爲#!r6rsfold-rightfilter都在圖書館(rnrs lists (6))中。也有SRFI-1它提供了這兩種R5RS語言的程序。

在無標準語言#!racket中,使用名稱foldr代替fold-right

2

map看起來像這樣一個奇怪的選擇。根據定義,它將函數映射到列表中的每個元素上並返回結果列表,因此嘗試「跳過」元素似乎不自然。

filter是你在找什麼。

(filter odd? '(1 2 3)) 
'(1 3) 
+0

我想重寫內置的過濾器這一第二章。 –

+0

看看我的下面答案所示的摺疊。如果你想自己寫所有的東西,寫一個簡單的函數,如果它滿足條件,然後遞歸(cdr輸入),就會將(汽車輸入)添加到結果中。任何討論lisp的教程應該有一個簡單的例子,你可以遵循。 – 2015-10-19 00:06:58

1

map對所有元素應用函數。函數的每次調用都應該與其他函數無關。即使你引入了一個封閉的狀態,你也不能避免map建立一個與你的輸入相同大小的列表。 您想要(重新)實現filter函數。如果你想自己做,你應該嘗試使用foldlfoldr

0
(cond 
    ((odd? x) x)) 

map檢查列表中的每個元素:如果是奇數,則返回該元素。但是當元素不是奇數時,你沒有告訴程序該做什麼,所以map返回void

要解決您的問題:請改爲使用filter,因爲map將爲列表中的每個元素返回一些內容。

如果你想知道如何實現filter,嘗試閱讀的SICP