如何调试" List包含异构数据类型"在球拍?

时间:2017-07-10 21:46:53

标签: racket

这是我的球拍问题:

  

定义一个以列表作为参数的函数。它应返回一个布尔值(即#t或#f),指示列表是否按升序排序。你可能不会使用内置的排序?功能。您的实现必须是递归的。

     

输入:同源数据类型的元素列表,包括数字或字符串。

     

输出:一个布尔值,指示列表的元素是否按严格递增的顺序排序。如果列表包含异构数据类型,则抛出错误(使用错误函数),并显示消息“错误:列表包含异构数据类型”。

所以当我输入这个函数时必须给我这个ERROR

  

(我的排序?'(7"垃圾邮件" 9))   !错误:列表包含异构数据类型

但是我的这个给了我这个

  

(我的排序?'(7"垃圾邮件" 9))   :合同违规     预期:真的吗?     给出:"垃圾邮件"     论点位置:第二     其他论点......:

这里有我的

(define (my-sorted-int? lst)
  (define size (length lst))
  (if (< size 2)
      #t
      (if (null? lst)
          #t
          (if (> (car lst) (car (rest lst)))  <======= Gave me Error
              #f
              (my-sorted-int? (rest lst) )))))

(define (my-sorted-string? lst)
  (define size (length lst))
  (if (< size 2)
      #t
      (if (null? lst)
          #t
          (if (string>? (car lst) (car (rest lst)))
              #f
              (my-sorted-string? (rest lst) )))))

(define (my-sorted? lst)
  (if (string? (car lst))
      (my-sorted-string? lst)
      (my-sorted-int? lst)))

1 个答案:

答案 0 :(得分:1)

所以你知道左边是一个数字,因为它是你最初检查的值,但是右边也需要是一个能够对其进行>的数字。因此你需要这样的东西:

(if (number? (cadr lst))
    (if (> (car lst) (cadr lst)) ...)
    (error "ERROR: List contains heterogenous data types"))

您可能希望使用cond来获得更平坦的结构。你也可以制作两个完全相同的程序来处理整数和字符串,只要你可以制作一个并传递不同的东西以使你的代码更干嘛:

(define (my-sorted? lst)
  (define (my-helper? correct-type? greater-than?)
    (let loop ((e (car lst))
               (lst (cdr lst)))
      (cond ((null? lst) #t)
            ((not (correct-type? (car lst)))
             (error "ERROR: List contains heterogenous data types"))
            ((greater-than? e (car lst)) #f)
            (else (loop (car lst) (cdr lst))))))

  (cond ((null? lst) #t)
        ((string? (car lst)) (my-helper? string? string>?))
        (else (my-helper? number? >))))