2016-09-18 49 views
1

的名單上有利用布爾具有1至替換在一個列表中的第一個數字,而不管其值的函數:球拍 - 應用一個布爾值列表

F({(0,1,0 ),(1,0,1),(1,0,0),...})= {(1,1,0),(1,0,1),(1,0,0),...。 ..}

到目前爲止,我有

(define (procB set) 
    (map (λ (lst1) ((number? (first lst1)) (cons 1 (rest lst1)))) set)) 

當功能被應用到組的其餘部分的麻煩。我得到的標準誤差

application: not a procedure; 
expected a procedure that can be applied to arguments 
given: #t 

我得到的,它是不工作,因爲那裏是一個布爾值(給定:#T),但我不太知道如何解決它。

+1

報告的錯誤表明您嘗試應用一個值,就像它是一個函數一樣 - 在這種情況下,解釋器假定'(number?(first lst1))'的結果是一個函數,而不是。如果您打算根據布爾比較的結果執行操作,則使用'if'或'cond'。 –

回答

1

您應該使用if表達式來測試,如果第一個值是一個數字 - 如果不是的話,我們該怎麼辦?我們可以放棄它。此外,你似乎有一對夫婦放錯地方的括號,這應該修正錯誤:

(define (procB set) 
    (map (λ (lst1) 
     (if (number? (first lst1)) 
      (cons 1 (rest lst1)) 
      lst1)) 
     set)) 

現在它按預期工作:

(procB '((0 1 0) (0 0 1) (1 0 0))) 
=> '((1 1 0) (1 0 1) (1 0 0)) 

只是可以肯定......如果子列表只能包含數字,那麼if表達式是多餘的,您在lambda內所要做的全部事情是(cons 1 (rest lst1))

+0

謝謝。這工作得很好。我縮短了不包含布爾值的代碼,但如果我確實需要一個,我現在將知道如何去做。 – CompNoob

1

它在我看來像你缺少一個if。在您的lambdamap,(number? (first lst1))將解析爲#t。然後,它會嘗試將程序#t應用於(cons 1 (rest lst1)),該程序會給出您所看到的錯誤。我懷疑你希望你的lambda更接近

(lambda (lst1) 
    (if (number? (first lst1)) 
     ; then cons 1 with the rest 
     ; else don't replace with a 1 
+0

謝謝。我想出了一個更簡單的方法來做到這一點,但如果我需要映射一個布爾值,我就會知道該做什麼。 – CompNoob