“事实上,列表推导和SQL之间的高度相似性并不是一个奇怪的事情,因为他们都是基于数学里的集合论”

微言大义。

关于王垠对数据库的理解

这篇回答下的评论很值得一看,很多人对于数据库的理解往往只停留在表面上,并没有深究其本质

我认为学习计算机最好的方法,就是去学习一门语言,下面是关于列表推导的一些例子。

列表推导是一种能够生成元素并对生成的元素做测试的表达式,格式如下

[Exp || Gen,Tests,Gen,Tests]

其中,Generator 的格式为

X <- [2,3,5,7,11]

Tests 可有可无,它们是一组布尔表达式,针对值和绑定变量的每一种组合进行求值。如果同一组内的全部 Tests 都返回 true,则从当前的绑定变量和它们的值上生成表达式。

两个例子

filter(P,Xs) -> [X || X <- Xs, P(X) ].
1> [Element || Element <- list:seq(1,4) , Element rem 2 == 0] . 
[2,4]

快排

qsort([]) -> [];
qsort([Pivot|T]) -> 
  qsort([X || X <- T,X < Pivot]) ++ [Pivot] ++ qsort([X || X <- T,X >= Pivot]).

不得不说,模式匹配加列表推导真的很强大


勾股数组

pythag(N) 函数生成一个包含所有符合勾股定理的 {A,B,C} 组合的列表

pythag(N) -> [{A,B,C} || A <- list:seq(1,N),B <- list:seq(1,N),C <- list:seq(1,N),
             A+B+C =< N,
             A * A + B * B =:= C * C].

1> lib_misc:pythag(16). 
[{3,4,5},{4,3,5}]

怀疑 erlang 和 prolog 存在着联系。另外感觉这种写法性能也不会太好。