列表理解和警卫

Mar*_*rov 0 erlang list-comprehension

如何AND在列表推导中实现警卫?用逗号分隔警卫似乎是这样的OR:

1> rd(r, {a, b}).
r
2> L = [#r{a = 1, b =2}, #r{a = 1, b = 3}].
[#r{a = 1,b = 2},#r{a = 1, b = 3}]
3> [X || X <- L, X#r.a =/= 1, X#r.b =/= 2].
[]
Run Code Online (Sandbox Code Playgroud)

非常感谢.

Mar*_*tos 7

这绝对是一个AND.第一个元素都没有通过测试; 第二次未通过X#r.a =/= 1测试.

如果你想要OR,只需使用orelse运算符:

2> [X || X <- L, X#r.a =/= 1 orelse X#r.b =/= 2].
[#r{a = 1,b = 3}]
Run Code Online (Sandbox Code Playgroud)

  • 小提示:'orelse'通常是你想要的,因为它会使表达式短路,这可能是你所期望的.'或'不这样做.[见#9](http://mazenharake.wordpress.com/2010/10/31/9-erlang-pitfalls-you-should-know-about/) (2认同)