我正在为项目重新创建一些基本的球拍功能 .
为此,我需要定义一个带有比较参数和列表的函数,并检查列表是否根据该参数进行排序 . 我显然不能只使用'已排序?' . 这是我到目前为止所拥有的:
(define (my-sorted? lst)
(λ (x)
(cond ((null? lst) #t)
((eq? (length lst) 1) #t)
((x (car (cdr lst)) (car lst))
(my-sorted? (cdr lst)))
(else #f))))
我不认为我正在应用比较功能,任何帮助?这个的标准输出应该是这样的:
(my-sorted? < '(2 5 6 9))
#t
虽然我很喜欢,但我的功能稍有不同 . 这个决定传递的比较是否是列表的成员,有点类似 . 这是我得到的:
(define (is-member? lst x)
(cond
[(empty? list) false]
[(= (car list) x) true] ;here is the error i think
[else (is-member? (rest list) x)]))
任何帮助或指导修复这些是非常感激,我似乎无法摆脱错误 .
2 回答
你的第一个函数返回一个函数:
这个问题是你的递归也返回一个需要以相同方式应用的函数 . 因此,当给出一个比较器时,你的函数将运行一步并返回一个需要一个新比较器的函数 . 你可以通过应用前一个值来解决这个问题:
或将其分开:
在第二个函数中,您使用
list
,就好像它是一个值而不是一个函数 .list
是一个库函数,它返回其参数列表 . 你不能在一个函数上做car
. 你也没有使用列表参数lst
所以我猜你混合了两个?如果你想调用这样的函数
你必须使参数列表看起来像它 - 你需要一个运算符
<
和一个列表作为参数 .您的第二个问题源于您怀疑的行中的拼写错误:
list
是函数的名称 . 并且你将它更正为lst
你的函数参数变量,然后它可以工作 . 目前,您的is-member?
仅适用于数字列表,因为相等测试程序=
仅对数字可靠地工作 . 考虑eql
,equal
和其他相等测试......