Haskell:让里面列表理解出乎意料的结果

BAR*_*ARJ 2 haskell list-comprehension let

我是哈斯凯尔的新手,我正在努力学习哈斯克尔.我试图以最可能的方式创建像"复制"这样的简单函数.我已经完成了"复制"模式匹配和警卫.我无法让它在列表理解中使用.我可以想象让列表理解不理想,但我更感兴趣为什么它不起作用=].

我的问题是:为什么复制'产生[Int]和复制''产生[[Int]],甚至可以用列表理解中的let生成[Int]?

感谢您的时间和帮助:).

--list comprehension
duplicate' xs = [y | x <- xs, y <- [x,x]]
input => [1,2,3,4]
output => [1,1,2,2,3,3,4,4]
expected? => yes

--list comprehension with let
duplicate'' xs = [y | x <- xs, let y = [x,x]]
input => [1,2,3,4]
output => [[1,1],[2,2],[3,3],[4,4]]
expected? => yes
Run Code Online (Sandbox Code Playgroud)

GS *_*ica 5

<-let只是意味着不同的东西.

当你写作时y <- [x,x],你说" 依次给出y列表[x,x]中的每个值".

当你写作时let y = [x,x],你说的是"给予y价值[x,x]".