假设我们有一个预定义的列表pairs,它是所有对(x,y)的列表,使得x,y∈{1..9}和2x = y.在Haskell中它看起来像:
pairs = [ (x,y) | x <- [1..9], y <- [1..9], 2 * x == y ]
Run Code Online (Sandbox Code Playgroud)
现在,我想用来pairs定义一个新列表triplets,它是所有三元组(x,y,z)的列表,使得x,y,z∈{1..9},2x = y和2y = z.写它的显而易见的方法是:
triplets = [ (x,y,z) | (x,y) <- pairs, (y,z) <- pairs ]
Run Code Online (Sandbox Code Playgroud)
奇怪的是,这不起作用.
现在,我知道它没有的技术原因:(y,z) <- pairs生成器循环比(x,y) <- pairs它更紧密,并且它指定的值会y覆盖y进入该循环之前的任何内容.但是你为什么要设计一种语言呢?是不是更直观(并且符合数学约定)让生成器"看到"它的左边并重用预先分配的值,以便每个变量在每次迭代中都有一个值?我认为这个设计选择背后一定有一个实用的理由,但我不确定它是什么.