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上提问的提示。非常感谢,现在我知道我的错误,您已清楚地解释了所有问题。再次感谢先生:)