用于计算列表中某种类型对象的变量(Racket)

时间:2014-08-16 21:51:27

标签: function variables racket

我有这段代码:

(define (countHearts cards)
  (let* ([count 0])
    (map (λ(x)
           (match x
             [(hearts number) (add1 count)]
             [_ #f])) cards))
  count)

卡片是这种格式的元素列表“(心号)”当我使用时:

(countHearts '( (hearts 1) (hearts 2)))

它返回(答案应为2):

#<procedure:count>

我想要的只是我的代码计算了我在列表中的“(心号)”(之前定义的类型)的数量,但我一直得到答案。有人有想法吗?我尝试了除add1之外的其他选项,如

!set count (+ count 1)

但结果是一样的。

2 个答案:

答案 0 :(得分:2)

尝试:

(define (count-hearts cards)
  (for/sum ([card cards])
    (match card
      [(list 'hearts n) 1]
      [_                0])))

答案 1 :(得分:1)

您的代码无效的原因

  1. (add1 count)将1添加到计数中,但会将结果抛弃;您需要set!计算(add1 count)
  2. 的结果
  3. 你有一个右括号太多,所以你的变量count超出范围而你返回了内置程序count - 需要在let*或{{}}内返回{1}}表达式(我使用let,因为这就足够了)
  4. FWIW,你和@ soegaard的代码都不适合我,并返回“匹配:模式中的语法错误”;我将let表达式修改为match
  5. 所以代码变成:  

    (list 'hearts _)

    然后

    (define (countHearts cards)
      (let ([count 0])
        (map (λ(x)
               (match x
                 [(list 'hearts _) (set! count (add1 count))]
                 [_ #f]))
             cards)
        count))
    

    <强>替代

    您可以使用内置> (countHearts '((hearts 1) (hearts 2))) 2 程序:

    count