List 如何修复scheme DrRacket中的违反合同错误?

List 如何修复scheme DrRacket中的违反合同错误?,list,scheme,racket,List,Scheme,Racket,第二个命令:绿名单3 4 5 6在返回false时返回一个错误。 相反,我得到了以下错误: 长度:违反合同 期望:列表? 给定值:3 我应该在代码中更改什么,使其返回false而不是错误 以下是绿名单的定义: 绿名单是一个非空的整数对列表,其中 integers是一个正好包含两个整数的列表,其中每对的xy具有y–x=1的属性 例如:“563423-5-4是一个绿名单 问题在于条件的顺序很重要:在and表达式中,条件按从左到右的顺序求值,如果一个条件为false,则跳过其他条件进行短路求值 您的输

第二个命令:绿名单3 4 5 6在返回false时返回一个错误。 相反,我得到了以下错误:

长度:违反合同 期望:列表? 给定值:3

我应该在代码中更改什么,使其返回false而不是错误

以下是绿名单的定义:

绿名单是一个非空的整数对列表,其中 integers是一个正好包含两个整数的列表,其中每对的xy具有y–x=1的属性

例如:“563423-5-4是一个绿名单

问题在于条件的顺序很重要:在and表达式中,条件按从左到右的顺序求值,如果一个条件为false,则跳过其他条件进行短路求值

您的输入是一个列表列表,因此您应该首先测试当前元素是否为实际列表-否则,您将尝试获取一个非列表的对象的长度—在您的示例中为数字3,这是一个错误

顺便说一下:可以简化代码,实际上不需要使用if,只需返回条件的值:

(define is1?
  (lambda (tuple)
    (if (and (= 2 (length tuple))
             (= 1 (- (cadr tuple) (car tuple)))
             (list? tuple))
        #t
        #f)))

(define greenlist?
  (lambda (x) (andmap is1? x)))

(greenlist? '((2 4 6) (5 6) (1 2)))
(greenlist? '(3 4 5 6))
问题在于条件的顺序很重要:在and表达式中,条件按从左到右的顺序求值,如果一个条件为false,则跳过其他条件进行短路求值

您的输入是一个列表列表,因此您应该首先测试当前元素是否为实际列表-否则,您将尝试获取一个非列表的对象的长度—在您的示例中为数字3,这是一个错误

顺便说一下:可以简化代码,实际上不需要使用if,只需返回条件的值:

(define is1?
  (lambda (tuple)
    (if (and (= 2 (length tuple))
             (= 1 (- (cadr tuple) (car tuple)))
             (list? tuple))
        #t
        #f)))

(define greenlist?
  (lambda (x) (andmap is1? x)))

(greenlist? '((2 4 6) (5 6) (1 2)))
(greenlist? '(3 4 5 6))

请使用适当缩进代码的编辑器,您不应该只使用右括号写行。请看我的答案,这是在Scheme中设置代码格式的正确方法。感谢您让我知道。请使用适当缩进代码的编辑器,您不应该只使用右括号来写行。请看我的答案,这是在Scheme中设置代码格式的正确方法。谢谢您让我知道。谢谢,它很有效。当我运行greenlist时,我得到了相同的错误?青苹果当我应该得到虚假。如何使其返回false而不是得到错误?那么您还需要检查输入是否是绿名单中的列表?作用但是说实话,你不应该检查类型是否正确,如果用户传递了错误的类型,这不是你的问题,这是一种动态类型的语言,你不必担心检查这些错误。例如,如果输入是“x”y怎么办?这将是另一种需要检查的情况。可以使用define/contract断言tuple是int的列表?谢谢,它可以工作。当我运行greenlist时,我得到了相同的错误?青苹果当我应该得到虚假。如何使其返回false而不是得到错误?那么您还需要检查输入是否是绿名单中的列表?作用但是说实话,你不应该检查类型是否正确,如果用户传递了错误的类型,这不是你的问题,这是一种动态类型的语言,你不必担心检查这些错误。例如,如果输入是“x”y怎么办?这将是另一种需要检查的情况。可以使用define/contract断言tuple是一个int列表?