Recursion Racket-将布尔值应用于列表列表
我有一个函数,它利用布尔值将列表中的第一个数字替换为1,而不考虑其值: f({(0,1,0),(0,0,1),(1,0,0),…})={(1,1,0),(1,0,1),(1,0,0),…} 到目前为止我有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
(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
。谢谢。我想出了一个更简单的方法,但是如果我需要映射布尔值,我会知道确切的操作方法。谢谢。这非常有效。我缩短了代码,不包括布尔值,但如果我真的需要一个,我现在就知道怎么做了。