You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Haskell列表推导式求值疑问:为何结果不是[(3,4),(3,2)]?

为什么Haskell列表推导式结果是[4,2]而非[(3,4),(3,2)]

拆解这个列表推导式[x | xs <- [[(3,4)],[(5,4),(3,2)]], (3,x) <- xs]的执行逻辑就清楚了:

  1. 第一个生成器:xs <- [[(3,4)],[(5,4),(3,2)]]
    xs会依次取列表里的两个子列表:先取[(3,4)],再取[(5,4),(3,2)]。

  2. 第二个生成器是带模式匹配的过滤:(3,x) <- xs
    这个生成器的作用是遍历xs中的每个元素,尝试匹配(3,x)这个模式:

    • 当xs是[(3,4)]时,元素(3,4)匹配(3,x),此时x被绑定为4,这一步会把x的值加入结果列表。
    • 当xs是[(5,4),(3,2)]时,第一个元素(5,4)和(3,x)模式不匹配(第一个元素是5而非3),直接跳过;第二个元素(3,2)匹配成功,x被绑定为2,同样把x的值加入结果列表。

整个推导式最终收集的是每次匹配成功后x的值,所以结果是[4,2]。

如果想要得到[(3,4),(3,2)],需要修改推导式,让生成的元素是匹配成功的整个元组,比如写成:

[y | xs <- [[(3,4)],[(5,4),(3,2)]], y@(3,_) <- xs]

这里y@(3,_)是模式匹配的同时绑定整个元组到y,最终收集的就是y,也就是匹配成功的元组。

内容的提问来源于stack exchange,提问作者kesarling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:20:59