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

Racket 如何检查列表是否为列表列表?,racket,Racket,我试图在将参数用于带有racket的函数之前检查它是否正确。此参数必须是列表的列表 我试过: (andmap (lambda (x) (not (and (list? x) (not (pair? x))))) lst) 与: 但是它失败了,因为(pair?'(a))是真的。对于对?我试图避免(a.1)点对,因为(list?(a.1))也是正确的 如何检查列表是否为列表列表且不包含点对?三件事: 要检查列表是否为列表列表,只需编写 (define (list-of-lists? v) (a

我试图在将参数用于带有racket的函数之前检查它是否正确。此参数必须是列表的列表

我试过:

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

但是它失败了,因为
(pair?'(a))
是真的。对于
对?
我试图避免
(a.1)
点对,因为
(list?(a.1))
也是正确的

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

三件事:

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

    (define (list-of-lists? v)
      (and (list? v) (andmap list? v)))
    
    它首先检查值是否为列表,然后检查其所有元素是否为列表

  • 如果您这样做是因为函数只应接受列表列表,而其他值是非法的,那么您应该通过使用而不是自己进行验证来简化操作:

    (require racket/contract)
    
    (define/contract (f lst-of-lsts)
      (-> (listof list?) any/c)
      #| do something here |#)
    
  • 像许多第一次接触到它的人一样,你似乎对
    quote
    的工作原理有些困惑。你的意思可能是写
    ((a)(b)(c))
    ,而不是
    ((a);(b);(c))
    。请阅读或仅使用
    列表
    功能


  • 等等,为什么
    (列表?'(a.1))
    是真的?当我评估我得到的false@AlexKnauth也许,我犯了一个错误。对不起,谢谢你的回答。我尝试了
    (列表列表?')
    ,它返回true。我将修改它以返回false。
    (require racket/contract)
    
    (define/contract (f lst-of-lsts)
      (-> (listof list?) any/c)
      #| do something here |#)