代码之家  ›  专栏  ›  技术社区  ›  VansFannel

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

  •  0
  • VansFannel  · 技术社区  · 6 年前

    我想先检查一个参数,然后再将它用于一个函数中。此参数必须是列表列表。

    我已经尝试过:

    (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 回复  |  直到 6 年前
        1
  •  2
  •   Alexis King    6 年前

    三件事:

    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 功能。