2011-04-13 110 views
1

我試圖解決這個問題。我想知道是否有人會幫助開始或給我一些提示。方案,函數列表作爲參數

函數調用apply-all,當給出函數和數字列表時,將產生函數的值的列表,當應用於該數字時。

例如, (apply-all (list sqrt square cube) 4) =>(2 16 64)

由於

確定。這是我到目前爲止,

(define (apply-all lst num) 
    (apply-allaux lst num '())) 

;; aux function 
(define (apply-allaux lst num acc) 
    (if (null? lst) 
     acc 
     (apply-allaux (cdr lst) num (cons (apply (car lst) num))))) 

但是當我運行這個

(apply-all '(positive?) 2) 

它給了我這個錯誤

mcar: expects argument of type <mutable-pair>; given 2 

誰能幫我看看這個問題好嗎?

+0

看看'map'函數。 – Marcin 2011-04-13 07:49:59

回答

2

迂腐隊長說:你採取一看程序設計方法(http://www.htdp.org)?

你需要寫下的例子開始 - 簡單的人比你有一個。另外,將結果寫入實際正確評估的表單中。 (在你的榜樣,舉例來說,如果你評估(2 16 64),你會得到一個錯誤。

接下來,如果你沒有經歷過發展的功能列表,你應該真的是閱讀第一HTDP十段;這遠不如一個堆棧溢出的答案可以

希望這有助於

+0

好的謝謝。我已經編程了幾年了。但是,我剛開始學習計劃。所以,這對我來說都是新的。 – prgrammer 2011-04-13 07:28:13

+0

不同意「將結果寫入實際正確評估的形式」。我相信,因爲結果始終是數據,所以永遠不要「代碼進行評估」,答案應該寫成「數據模式」形式,而不是「代碼模式」形式。即結果應該是「(2 16 64)」,而不是「(2 16 64)」。是的,這意味着您不能直接將數據直接輸入到REPL中,而是不需要先引用它,但是_learning代碼和數據模式之間的區別_是學習Scheme的關鍵部分。恕我直言。 – 2011-04-13 12:16:28

+0

@Chris:數字和字符串是什麼?他們的表述應該不同嗎? – 2011-04-13 21:19:07

1

在回答您的嘗試,我會爲您提供一些提示,通過讓你:-)

!。
  • 你不需要在你的情況下使用applyapply不會做你認爲它的工作,儘管你的任務是要你做一個叫做apply-all的功能。
  • cons需要兩個參數。
  • '(positive?)是一個包含符號的列表名爲positive?,而不是positive?函數。您的任務使用(list ...)有很好的理由。如果您想要比list更緊湊的東西,請使用準分類:`(,positive?)
  • 你應該考慮使用map,就像Marcin的評論所暗示的那樣。
  • 如果您不能使用map,然後記住,當你使用「迭代與累加器」模式,你的結果出來了逆轉。您必須反轉輸入列表或結果。

這裏是我的參考解決方案,它把我半分鐘寫。 :-)我希望你可以用它來微調你現有的版本。 (我很喜歡張貼它,因爲我確定你的標記不會讓你使用cut,如果你能弄清楚如何讓我的版本可以接受你的標記,那麼你已經贏了。)

(define (apply-all fns . args) 
    (map (cut apply <> args) fns)) 
+1

謝謝。我解決了它! – prgrammer 2011-04-13 20:21:50

0

鑑於簽名:

; apply-all : (listof (number -> number)), number -> (listof number) 

考慮什麼應用,都應該返回:

  • 當列表爲空:一個空列表(沒有功能適用)
  • 當列表不爲空時:使用數字上的第一個函數,將結果與自然遞歸結合起來,這對於列表是有意義的(列表應該縮小遞歸)。