有人知道如何在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?
答案 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]
我们所拥有的是从1
到10
的两个整数之间的所有乘法。由于列表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] ]
但这会计算两组的笛卡尔积,得到一个完整的乘法表而不是一个正方形列表。