列表上的Haskell点阵符号 - 意外输出

时间:2016-05-08 13:11:44

标签: haskell list-comprehension

我的一个讲座中提出的一个问题如下:

trips :: [(Int, Int, Int)]
trips = [ (x,y,z) | z <- [2..], y <- [2..z-1], x <- [2..y-1] ]

What is the first five elements output?

现在我以为我知道点点符号是如何工作的,但是当我把上面的内容放到编译器中时输出是:

(2,3,4),(2,3,5),(2,4,5),(3,4,5),(2,3,6)等。

这是怎么发生的?

我认为如果事情以[2 ..]开始,那么所有后续的列表都会以两个开头? z被定义为[2 ..]但它从来没有一次显示2作为第三个int。我显然在这里遗漏了一些东西,但我不完全确定是什么。

1 个答案:

答案 0 :(得分:6)

[ (x,y,z) | z <- [2..], y <- [2..z-1], x <- [2..y-1] ] =
[ (x,y,2) | y <- [2..2-1], x <- [2..y-1] ] ++
[ (x,y,3) | y <- [2..3-1], x <- [2..y-1] ] ++
[ (x,y,4) | y <- [2..4-1], x <- [2..y-1] ] ++
... =
[ (x,y,2) | y <- [2..1], x <- [2..y-1] ] ++
[ (x,y,3) | y <- [2..2], x <- [2..y-1] ] ++
[ (x,y,4) | y <- [2..3], x <- [2..y-1] ] ++
... =
[ (x,y,2) | y <- [], x <- [2..y-1] ] ++
[ (x,y,3) | y <- [2], x <- [2..y-1] ] ++
[ (x,y,4) | y <- [2,3], x <- [2..y-1] ] ++
...

请注意范围y <- [2..2-1],即y <- [2..1],即y <- []。因此,不会生成三元组(x,y,2)

同样,当y2时,范围z <- [2..y-1]不会生成任何内容,我们也不会获得(x,2,3)形式的三元组。