2015-02-09 50 views
0

我該如何解決這個問題?球拍/多個功能

給定一個arity 1和一個列表的函數,返回一個將函數應用到原始列表的每個元素的列表。例如:

(Mmap add1 '(1 2 3 4))      ; -> '(2 3 4 5) 
(Mmap car '((1 2 3) (4 5 6) (7 8 9)))   ; -> '(1 4 7) 
(Mmap cdr '((1 2 3) (4 5 6) (7 September 8))) ; -> '((2 3) (5 6) (8 9)) 

我試過cond和其他類似的函數,但我真的不知道如何解決它。

+0

請說明上次調用的輸出。 – leppie 2015-02-09 05:02:29

+0

@leppie我猜最後一次調用應該有''(7 8 9)'作爲最後的列表元素 - 我不知道OP如何改變這一點,但。 – 2015-02-09 05:04:39

+0

@AlexisKing最後一個電話,是電話,並感謝編輯我的帖子 – Taiz 2015-02-09 05:31:53

回答

1
(define (myfunc f alist) 
    (cond 
    [(empty? alist) empty] 
    [else (cons (f (first alist)) (myfunc f (rest alist)))] 
    )) 

f是你的函數(例如ADD1,汽車)和alist是你的論點。您只需構建一個列表,將f應用於您的第一個參數,並遞歸添加列表的其餘部分。

關於你的最後一個例子。我假設9月以前定義爲(define September 8)。在這種情況下,你的例子不會給你想要的輸出。最後一個列表將包含'September而不是8個,因爲您已將您的列表聲明爲'(),它將名稱視爲符號。

此外,輸出應爲'((2 3) (5 6) (8 8)),因爲cdr返回列表的第二個和後續元素。因此,您可能需要(list 7 September 9)作爲您輸入內容的最後一個列表,以便代之以獲得'((2 3) (5 6) (8 9))

你不得不這樣調用該函數:(myfunc cdr (list (list 1 2 3) (list 4 5 6) (list 7 September 9)))

編輯:很明顯,這將使最有意義的定義九月9,因爲它是一年中第一個月,這樣調用該函數: (myfunc cdr (list (list 1 2 3) (list 4 5 6) (list 7 8 September)))

-1

Mmap可以根據#lang racket的函數map來定義。

(define Mmap map)