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)
那么这里有两个问题:语法问题和语义问题.
语法一个是你用逗号()分隔列表推导的部分(这些可以是生成器,过滤器和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)
我们这里所拥有的是两个整数之间的所有乘法从1到10.由于每一个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)
您需要将两个范围压缩在一起:
[ 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)
但这会计算两个集合的笛卡尔积,从而得到一个完整的乘法表而不是一个平方列表。
| 归档时间: |
|
| 查看次数: |
409 次 |
| 最近记录: |