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
相关产品推荐
相关产品推荐

