在球拍中,我知道有一个member函数会返回某个元素的第一次出现(如果存在)或#f其他情况,但是是否有一个函数仅返回#t或#f判断该元素是否存在于列表中?
这个问题的答案是member。在 Racket 中,一切不真实的#f都是真实的。因此,member可以很好地测试列表中元素的存在:
> (if (member 3 '(1 2 3)) 'present 'absent)\n'present\n> (if (member 3 '(1 2)) 'present 'absent)\n'absent\nRun Code Online (Sandbox Code Playgroud)\n\n\xe2\x80\x99s 不需要#t在成功时专门生成,因为 Racket 中分支的所有内容只关心#f非#f值。
在某些罕见的情况下,您确实需要布尔值,例如,如果您要将结果存储在某些数据结构中,并且不想保留对列表的不必要的引用。在 Racket 中执行此操作的常用习惯用法是(and v #t),其中v是某个值,因为这相当于编写(if v #t #f)。因此,您可以将您的呼叫包围起来member:
> (and (member 3 '(1 2 3)) #t)\n#t\nRun Code Online (Sandbox Code Playgroud)\n\n由于很少需要这样做,因此在 Racket 中这比编写单独的member?函数更惯用。