【问题标题】:racket - define-struct and abstract list function球拍 - 定义结构和抽象列表功能
【发布时间】:2020-03-18 03:18:14
【问题描述】:

我正在尝试创建一个函数games-won,它使用游戏列表、结果和字符串、名称,并在name 获胜的结果中生成games 的数量。

例如:

(define-struct game (winner loser high low))
(check-expect (games-won (list (make-game "Lori" "Troy" 52 34)
                         (make-game "Mary" "Lori" 30 20)) "Lori") 1)

以下是我目前所拥有的:

(define (won? game name)
  (equal? (game-winner game) name))

(define (wonlst results)
  (filter won? results))

(define (lst-length lst)
  (cond
    [(empty? lst)  0]
    [(cons? lst)   (+ 1 (length (rest lst)))]))

(define (games-won results)
 (cond
   [(cons? (wonlst results)) (lst-length (wonlst results))]
   [else 0]))

谁能帮助纠正我的代码中的错误,也许可以告诉我如何使用local 并将这些功能放在一起?

【问题讨论】:

    标签: racket


    【解决方案1】:

    以下是修复:

    • 正如测试所示,games-won 应该接受两个参数:结果列表和名称。所以我们添加一个参数 - name - 到games-won
    • 您不需要自定义lst-length 函数,只需使用length。此外,games-won 无需担心在else 情况下返回0。基本情况由列表抽象处理。
    • 注意won? 接受两个输入,但filter 中的谓词函数只接受一个输入。所以我们从won? 中删除name。一旦我们将won? 放入本地,它就可以从周围函数的上下文中使用name
    • 我们在games-won 中放置了一个本地函数,并将两个助手——won?won-lst——放在了本地函数中。
    • 您应该使用string=? 而不是equal?for,因为我们知道gamenamewinner 字段始终是一个字符串。
    (define-struct game (winner loser high low))
    
    ; games-won : [List-of Game] String -> Number
    (define (games-won results name)
      (local (; won? : Game -> Boolean
              (define (won? game)
                (string=? (game-winner game) name))
              ; wonlst : [List-of Game] -> [List-of Game]
              (define (wonlst results)
                (filter won? results)))
        (length (wonlst results))))
    
    
    (define my-games1 (list (make-game "Lori" "Troy" 52 34)
                            (make-game "Mary" "Lori" 30 20)))
    
    (check-expect (games-won my-games1 "Lori") 1)
    

    我们可以将所有内容与 lambda 一起放入一个函数中,如下所示:

    (define (games-won results name)
      (length (filter (λ (game) (string=? (game-winner game) name)) results)))
    

    如何使用local

    局部表达式具有以下形状:

    (local [definition ...] body-expression)
    

    在方括号内,您可以根据需要放置任意数量的定义(即defines、define-structs),并且在本地的正文中——body-expression——你可以将可能使用或不使用定义的任何表达式放在方括号内。这些定义仅在正文中可用。

    来自HtDP,这是我们使用本地计算的方式:

    • 我们重命名本地定义的常量和函数,以使用程序中其他地方未使用的名称。

    • 我们将局部表达式中的定义提升到顶层,然后评估局部表达式的主体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2012-02-03
      • 2015-06-08
      • 2015-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多