Racket 我是新手,需要一些帮助来完成这个功能

Racket 我是新手,需要一些帮助来完成这个功能,racket,Racket,我希望答案是#t这里: > (is-member? "foo" '(4 5 #f "foo" a)) #t 但我得到了一个错误: > (is-member? "foo" '(4 5 #f "foo" a)) ;string=?: contract violation ; expected: string? ; given: #f ; argument position: 2nd ; other arguments...: ; "foo" 我对是成员?和是成员字符串?的

我希望答案是
#t
这里:

> (is-member? "foo" '(4 5 #f "foo" a))
#t
但我得到了一个错误:

> (is-member? "foo" '(4 5 #f "foo" a))
;string=?: contract violation
;  expected: string?
;  given: #f
;  argument position: 2nd
;  other arguments...:
;   "foo"
我对
是成员?
是成员字符串?
的定义如下:

#lang racket

(define (is-member? num lst)
  (if (null? lst)
      #f
      (if (string? num)
          (is-member-string? num lst)
          (is-member-number? num lst))))

(define (is-member-string? num lst)
  (if (null? lst)
      #f
      (if (integer? (car lst))
          (is-member-string? num (rest lst))
          (if (string=? (car lst) num)
              #t
              (is-member-string? num (rest lst))))))

(define (is-member-number? num lst)
  ....)
  • 查看错误消息,看看它如何帮助您。它说错误来自
    string=?
    ,如果您查看DrRacket,它甚至会突出显示出错的特定调用。这是
    is member string?
    函数中的
    (string=?(car lst)num)

  • 弄清楚什么是争论,为什么他们错了。错误消息说错误的参数是
    #f
    ,它需要一个字符串

  • 这场糟糕的争论是从哪里来的?是
    num
    还是
    (汽车lst)
    ?看看
    num
    如何在程序中流动,
    num
    应该始终是
    “foo”
    ,所以它可能是另一个,
    (carlst)

  • 这段代码是如何使用那个错误的参数执行的?为什么这里的
    (car lst)
    为false?因为它正在遍历列表,而列表中包含一个false。这应该很好,只要您正确地设计函数来处理所有值

  • 为此,您应该在函数上放置一个类型签名,以显示允许哪些类型的参数。对于
    是否为成员字符串?
    我假设您的意思是:

    ;; is-member-string? : String [List-of Any] -> Boolean
    (define (is-member-string? str lst)
       ....)
    
    (我将
    num
    重命名为
    str
    ,因为它不是数字,而是字符串。)

    接下来,您需要确保代码与签名一起工作。您正在通过分解列表参数来设计此函数,但需要记住值的类型:

    ;; is-member-string? : String [List-of Any] -> Boolean
    (define (is-member-string? str lst)
      (if (null? lst)
          #f
          (.... (first lst) ; (first lst) is an Any
           .... (rest lst)))) ; (rest lst) is a [List-of Any]
    
    (我使用的是
    first
    而不是
    car
    ,因为
    first
    更有意义。)

    你能看出现在出了什么问题吗

    ;; is-member-string? : String [List-of Any] -> Boolean
    (define (is-member-string? str lst)
      (if (null? lst)
          #f
          (if (integer? (first lst))             ; (first lst) is an Any
              (is-member-string? str (rest lst))
              (if (string=? (first lst) str)     ; (first lst) is an Any, but not an integer
                  #t
                  (is-member-string? str (rest lst))))))
    
    (first lst)
    是一个
    Any
    ,但您使用的是
    (string=?(first lst)str)
    。除非您确定
    (first lst)
    是一个字符串,否则这是不允许的

    有两种方法可以做到这一点。解决这个问题的一种方法是使用
    (equal?(first lst)str)

    ;; is-member-string? : String [List-of Any] -> Boolean
    (define (is-member-string? str lst)
      (if (null? lst)
          #f
          (if (equal? (first lst) str)
              #t
              (is-member-string? str (rest lst)))))
    
    第二种方法是在使用
    string=?
    之前检查它是否是字符串。我想这就是您试图对
    整数?
    检查所做的,但它不起作用。相反,您希望以某种方式使用
    (string?(first lst))
    。在这之后,您只需要检查
    string=?
    。一种方法是使用

    ;; is-member-string? : String [List-of Any] -> Boolean
    (define (is-member-string? str lst)
      (if (null? lst)
          #f
          (if (and (string? (first lst)) (string=? (first lst) str))
              #t
              (is-member-string? str (rest lst)))))
    

    标题应该是“球拍”,不是吗?此外,将所有错误和代码作为文本发布在此处。永远不要发布代码的图片。为什么你的主题说Python而你的图片说Racket?很抱歉我是新来的,好吧,我会再次更改所有内容。如果你不知道比较的是哪种类型,请使用
    equal?
    。对于两个看起来相同的值,它将返回
    #t
    。除非您确定两个参数都是字符串,否则不应使用
    string=?
    。请查看有关如何在StackOverflow上提问的提示。非常感谢,现在我知道我的错误,您已清楚地解释了所有问题。再次感谢先生:)