在haskell中使用列表理解和两个变量

时间:2018-05-21 14:51:54

标签: haskell functional-programming list-comprehension

有人知道如何在haskell中使用两个变量进行列表理解吗?

离。

[ x * y  | x <- [1..10]  y <- [1..10]]

它应该导致

[1,4,9,16,25,36,49,64,81,100]

但它实际上以ghci

收益
<interactive>:13:23-24: error:
    parse error on input ‘<-’
    Perhaps this statement should be within a 'do' block?

2 个答案:

答案 0 :(得分:7)

这里有两个问题:语法一个,语义一个。

走向有效的列表理解表达式

语法上的一个是你用分隔列表理解的部分(这些可以是生成器过滤器let子句)逗号(,

[ x * y  | x <- [1..10], y <- [1..10]]

但现在我们获得所需的输出。事实上:

Prelude> [ x * y  | x <- [1..10], y <- [1..10]]
[1,2,3,4,5,6,7,8,9,10,2,4,6,8,10,12,14,16,18,20,3,6,9,12,15,18,21,24,27,30,4,8,12,16,20,24,28,32,36,40,5,10,15,20,25,30,35,40,45,50,6,12,18,24,30,36,42,48,54,60,7,14,21,28,35,42,49,56,63,70,8,16,24,32,40,48,56,64,72,80,9,18,27,36,45,54,63,72,81,90,10,20,30,40,50,60,70,80,90,100]

我们所拥有的是从110的两个整数之间的所有乘法。由于列表x中的每个[1..10],我们都会遍历[1..10]的{​​{1}}列表。但是这与您请求的列表不匹配,因此是语义错误。

获取正方形列表

您似乎想要的是所有 square 数字的列表。在这种情况下,只有一个变量y,对于x的每个值,我们会产生x

x*x

然后产生:

[ x * x  | x <- [1..10]]

并行枚举列表

如果您要并行枚举两个列表,可以使用Prelude> [ x * x | x <- [1..10]] [1,4,9,16,25,36,49,64,81,100] 执行此操作,例如,如果我们想要使用{{1}元素多余zip的元素 elementwise ,我们可以这样做:

[1..10]

答案 1 :(得分:4)

您需要将两个范围压缩在一起:

[ x * y | (x, y) <- zip [1..10] [1..10] ]

可以有两个独立的迭代器,用逗号分隔

[ x * y | x <- [1..10], y <-[1..10] ]

但这会计算两组的笛卡尔积,得到一个完整的乘法表而不是一个正方形列表。