Recursion Racket-将布尔值应用于列表列表

Recursion Racket-将布尔值应用于列表列表,recursion,boolean,racket,Recursion,Boolean,Racket,我有一个函数,它利用布尔值将列表中的第一个数字替换为1,而不考虑其值: f({(0,1,0),(0,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 procedu

我有一个函数,它利用布尔值将列表中的第一个数字替换为1,而不考虑其值:

f({(0,1,0),(0,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),但我不太确定如何修复它。

在我看来,如果,您似乎缺少一个
。在
映射中的
lambda
中,
(编号?(第一个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

您应该使用
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))

只是想确定一下。。。如果子列表只能包含数字,那么
如果
表达式是多余的,那么在
lambda
中所要做的就是
(cons 1(rest lst1))

报告的错误表明您试图应用一个值,就好像它是一个函数一样-在这种情况下,解释器假设
(number?(第一部分(1))
是一个函数,但它不是。如果您打算根据布尔值比较的结果执行操作,请使用
If
cond
。谢谢。我想出了一个更简单的方法,但是如果我需要映射布尔值,我会知道确切的操作方法。谢谢。这非常有效。我缩短了代码,不包括布尔值,但如果我真的需要一个,我现在就知道怎么做了。