Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 初学者对列表理解的质疑Haskell_List_Haskell_List Comprehension - Fatal编程技术网

List 初学者对列表理解的质疑Haskell

List 初学者对列表理解的质疑Haskell,list,haskell,list-comprehension,List,Haskell,List Comprehension,我目前正在做维基上的99个Haskell问题。话虽如此,我正在做第26道题,这道题需要一个程序,可以写出给定集合中n个元素的所有组合。我用很多函数实现了我的程序,程序看起来是正确的。但我的问题不是来自于此,而是来自Haskell Wiki的一个解决方案 combinations :: Int -> [a] -> [[a]] combinations 0 _ = [ [] ] combinations n xs = [ y:ys | y:xs' <- tails xs

我目前正在做维基上的99个Haskell问题。话虽如此,我正在做第26道题,这道题需要一个程序,可以写出给定集合中n个元素的所有组合。我用很多函数实现了我的程序,程序看起来是正确的。但我的问题不是来自于此,而是来自Haskell Wiki的一个解决方案

combinations :: Int -> [a] -> [[a]]
combinations 0 _  = [ [] ]
combinations n xs = [ y:ys | y:xs' <- tails xs
                           , ys <- combinations (n-1) xs']

它们可能没有任何实际用途,但它们为我演示了一个Haskell初学者,一种非常奇怪的行为。为什么应用
z,由于不同的原因,它们有不同的结果。如果我们有

[ expression | a <- as, b <- bs ]
即使
b
未在
表达式中使用
,我们仍然会得到更多的元素。例如,
concatMap(const[1])[1..10]
将导致
复制10 1
。因此,如果您在理解中添加另一个列表,则会更改
concatMap
的数量,从而也会更改输出的数量(除非该列表仅包含一个元素):

[a | a代码

combinations n xs = [ y:ys | y:xs' <- tails xs
                           , ys <- combinations (n-1) xs']

x
的值不会影响
42
的值,因为
42
是常数,但它会影响其多重性。这与[1,2,3]:print(42)中x的命令循环
非常相似
,它会多次生成其输出。

如果您希望最后两个表达式具有相同的值,那么这是因为误解了列表理解的实际含义。您没有说明您的理解是什么(甚至您希望表达式的输出是什么),因此很难看到如何更正它(注意:最后一个表达式相当于
concatMap(\ys->case ys of{y:xs->concatMap(\z->[xs])xs;[]->[]})(tails[1,2,3])
)我认为Haskell中的列表理解是指守卫前面的表达式给出的一组值,它尊重守卫右边给出的约束。我的想法是错误的吗?因为根据这个想法,应用z在某些情况下,你模糊的直觉可能是准确的,但正如你所看到的,它实际上并不符合se列表理解的语义。有关列表理解的语义,请参阅。您可以使用语义将表达式转换为使用正则函数定义的表达式,然后说服自己这两个表达式不相等。
xs
的值不会更改,但列表理解提供的是一个值列表,而不是一个集合。In特别是,如果右侧有嵌套的生成器,则可以重复值。
concatMap (\a -> concatMap (\b -> [expression]) bs) as
[a | a <- [1..10]]             -- results in [1..10]
[a | a <- [1..10], _ <- [1,2]] -- results in [1,1,2,2,3,3,4,4,...,9,9,10,10]
[a | _ <- [1,2], a <- [1..10]] -- results in [1..10] ++ [1..10]
combinations n xs = [ y:ys | y:xs' <- tails xs
                           , ys <- combinations (n-1) xs']
[ 42 | x <- [1,2,3 ] ] == [ 42, 42, 42 ]