Haskell 列表理解如何评估?

问题描述 投票:0回答:2

我正在学习 Haskell 和我遇到了这个与列表推导相关的示例:

[x | xs <- [[(3,4)],[(5,4),(3,2)]], (3,x) <- xs]

给出的答案是:
[4,2]

为什么没有答案

[(3,4),(3,2)]

haskell list-comprehension
2个回答
2
投票

(3,x)
(3,4)
匹配得到
x = 4
。如果你想要
(3,4)
,你应该写
[(3,x) | ...]


0
投票

为什么没有答案

[(3,4),(3,2)]

列表理解:

[x | xs <- [[(3,4)],[(5,4),(3,2)]], (3,x) <- xs]

意味着

xs
将被“分配”列表
[[(3, 4)], [(5, 4), (3, 2)]]
的每个元素,因此这意味着在第一次“迭代”中
xs
[(3,4)]
,在第二次“迭代”中它是
[(5, 4), (3, 2)]

然后同样的技巧发生在

(3, x) <- xs
部分:它将枚举
xs
中的项目,并尝试将其与
(3, x)
匹配,所以首先第一个“候选者”是
(3, 4)
,并且匹配,所以
x = 4
会产生一个结果;接下来是
(5, 4)
,但这不起作用,因为 2 元组的第一项是
5
,而不是
3
。最后尝试使用
(3, 2)
,因此给出
x
x = 2

这样做的结果是我们得到一个包含

4
2
的列表,所以
[4, 2]

© www.soinside.com 2019 - 2024. All rights reserved.