我正在学习 Haskell 和我遇到了这个与列表推导相关的示例:
[x | xs <- [[(3,4)],[(5,4),(3,2)]], (3,x) <- xs]
[4,2]
。
为什么没有答案
[(3,4),(3,2)]
?
将
(3,x)
与 (3,4)
匹配得到 x = 4
。如果你想要 (3,4)
,你应该写 [(3,x) | ...]
。
为什么没有答案
?[(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]
。