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

时间:2016-09-18 15:45:46

标签: 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 procedure;
expected a procedure that can be applied to arguments
 given: #t

我认为它不起作用,因为有一个布尔值(给定:#t),但我不太确定如何解决它。

2 个答案:

答案 0 :(得分:1)

我认为你错过了if。在lambda的{​​{1}}中,map将解析为(number? (first lst1))。然后,它会尝试将#t程序应用于#t,从而为您提供您所看到的错误。我怀疑你希望你的(cons 1 (rest lst1))更接近

lambda

答案 1 :(得分: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))