如何检查列表是否为列表列表?

时间:2018-11-18 16:31:41

标签: racket

我正在尝试在带有球拍的功能中使用某个参数之前先检查该参数。此参数必须是列表的列表。

我尝试过:

(andmap (lambda (x) (not (and (list? x) (not (pair? x))))) lst)

具有:

(define lst '('(a) '(b) '(c)))

但是它失败了,因为(pair? '(a))为真。对于pair?,我尝试避免使用(a . 1)点对,因为(list? (a . 1))也是如此。

如何检查列表是否为列表列表且不包含杂物对?

1 个答案:

答案 0 :(得分:2)

三件事:

  1. 要检查列表是否为列表列表,只需编写

    (define (list-of-lists? v)
      (and (list? v) (andmap list? v)))
    

    首先检查该值是否为列表,然后检查其所有元素是否为列表。

  2. 如果您这样做是因为某个函数应该仅接受一个列表,而其他值是非法的,则应该使用Racket’s contract system使事情变得更轻松而不是自己进行验证:

    (require racket/contract)
    
    (define/contract (f lst-of-lsts)
      (-> (listof list?) any/c)
      #| do something here |#)
    
  3. 您和许多初次接触它的人一样,对quote的工作方式似乎有些困惑。您可能是写'((a) (b) (c))而不是'('(a) '(b) '(c))。请阅读What is the difference between quote and list?,或只使用list函数。