2013-06-25 52 views
1

我很難理解如何構建一個解決方案來解決我對lambda表達式的作業問題。我必須編寫一個函數,它接受一個參數F,它是一個謂詞函數,並返回一個與F相反的新函數。嵌套lambda函數的方案

我知道在我的函數中的某個地方,我會返回不是來自傳入的謂詞函數中的值,而是返回相反的結果,但我對其餘的問題描述感到困惑。這個問題指出:「你將需要一個lambda表達式中的lambda表達式,因爲你不知道F會採用多少個參數(並且實際上可能需要一個可變數字),你將不得不使用apply和定義lambda表達式的語法這需要任意數量的參數「

我不明白如何設置嵌套的lambda表達式來做我想要的任何F可能會返回相反。我一直在試驗一些不同的東西,只是爲了看看我能不能到達任何地方,但我不明白嵌套的lambda表達式如何工作足以讓我到達任何地方。

(define converse 
    (lambda (F) 
    (lambda 
     (apply (not (F)))))) 

我知道這不會工作,但我需要幫助瞭解如何設置我的嵌套lambda表達式來做我想做的事情。

回答

6

你非常接近答案:

(define converse 
    (lambda (f) 
    (lambda args 
     (not (apply f args))))) 

基本上,你錯過了args參數的最裏層lambda,這將保持着可變數量的參數是f可以接收。 not將在之後應用對參數調用f。例如,藉此謂詞兩個參數:

(define (test x y) 
    (> x y)) 

看看它是如何工作正常:

(test 10 5) 
=> #t 
(test 5 10) 
=> #f 
(test 10 10) 
=> #f 

現在你看看它是如何工作後converse已應用於test。請注意,它有處理兩個參數沒有問題:

((converse test) 10 5) 
=> #f 
((converse test) 5 10) 
=> #t 
((converse test) 10 10) 
=> #t 

補充說明:在拍,我們就已經實施的converse過程存在,它被稱爲negate。我們可以像這樣容易地實現converse

(define converse negate) 
+0

您可能使用的教學語言不允許使用:'lambda args'。這通常是Scheme中的_works_,它是定義具有可變數量參數的lambda的正確方法,但您的教學語言將其標記爲錯誤。嘗試使用更高級的教學語言 –

+0

因此,當我測試我得到一個錯誤想要在第二個lambda中的「參數」周圍的parens。當我進行更改並再次測試時,我收到另一個錯誤,說我的過程只需要1個參數,但找到了2. – Yoink

+0

不,你不能在args上添加括號!這就是我們告訴Scheme期望可變數量參數的方式。告訴我,你使用的是什麼教學語言? –