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

Haskell列表推导式输出空列表,为何与预期不符?

理解Haskell列表推导式的求值逻辑

嘿,我来帮你搞明白这个问题~你写的列表推导式[x:ys | x<-[1,2], ys<-[]]输出[]完全符合Haskell的规则,咱们一步步拆解你的误解在哪里:

核心问题:列表推导式的生成器是笛卡尔积关系

Haskell里的列表推导式,多个用逗号分隔的生成器遵循笛卡尔积逻辑——也就是说,必须每个生成器都能取出元素,才能组合出最终的结果项。

你的第二个生成器是ys<-[],而空列表[]里没有任何元素可以取。这就意味着:

  • 当第一个生成器取x=1时,找不到对应的ys值,这个组合不会产生任何结果;
  • 当第一个生成器取x=2时,同样找不到ys值,也不会产生结果;
  • 最终整个推导式自然没有任何输出,结果就是[]。

你预期[1,2]的误解点

你可能误以为x:ys里的ys会默认是空列表,但Haskell不会自动给生成器补默认值——生成器必须明确从你指定的列表中获取元素。如果没有元素可取,对应的组合就直接被丢弃了。

如何得到你预期的结果?

如果你想要的输出是[1,2],其实根本不需要第二个生成器,直接写:

[x | x <- [1,2]]

就可以得到你想要的结果。

要是你本来想构造的是每个元素都是单元素列表的列表(比如[[1],[2]]),那应该把ys明确指定为空列表,写法是:

[x:[] | x <- [1,2]]
-- 或者更直观的写法:[[x] | x <- [1,2]]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:53:01