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

val*_*s21 1 haskell functional-programming list-comprehension

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

恩.

[ x * y  | x <- [1..10]  y <- [1..10]]
Run Code Online (Sandbox Code Playgroud)

它应该导致

[1,4,9,16,25,36,49,64,81,100]
Run Code Online (Sandbox Code Playgroud)

但它实际上是以ghci收益的

<interactive>:13:23-24: error:
    parse error on input ‘<-’
    Perhaps this statement should be within a 'do' block?
Run Code Online (Sandbox Code Playgroud)

Wil*_*sem 7

那么这里有两个问题:语法问题和语义问题.

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

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

[ x * y  | x <- [1..10], y <- [1..10]]
Run Code Online (Sandbox Code Playgroud)

但现在我们无法获得所需的输出.确实:

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]
Run Code Online (Sandbox Code Playgroud)

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

获取正方形列表

你似乎想要的是所有数的列表.在这种情况下,只有一个变量x,对于每个值x,我们产生x*x:

[ x * x  | x <- [1..10]]
Run Code Online (Sandbox Code Playgroud)

然后产生:

Prelude> [ x * x  | x <- [1..10]]
[1,4,9,16,25,36,49,64,81,100]
Run Code Online (Sandbox Code Playgroud)

并行列举列表

如果您想要在平行列举两个列表,你可以用一个做到这一点zip,如果我们想muliply的元素,例如[1..10]具有的元素[5..14] 的elementwise,我们可以这样做:

[ x * y  | (x, y) <- zip [1..10] [5..14]]
Run Code Online (Sandbox Code Playgroud)

  • 可能值得一提的是"ParallelListComp"和`[x*y | x < - [1..10] | y < - [1..10]]`. (2认同)

che*_*ner 5

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

[ x * y | (x, y) <- zip [1..10] [1..10] ]
Run Code Online (Sandbox Code Playgroud)

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

[ x * y | x <- [1..10], y <-[1..10] ]
Run Code Online (Sandbox Code Playgroud)

但这会计算两个集合的笛卡尔积,从而得到一个完整的乘法表而不是一个平方列表。