Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
Haskell子集递归_Haskell_Recursion_Subset - Fatal编程技术网

Haskell子集递归

Haskell子集递归,haskell,recursion,subset,Haskell,Recursion,Subset,我对stack overflow和Haskell是新手,所以如果有其他方法,请告诉我 这在很大程度上重复了这个堆栈溢出问题,但是这个问题得到的答案并没有真正帮助我,我仍然对这个问题中的递归是如何工作的感到困惑。这是我为这个问题再次开始对话的尝试 问题是: 我对以下代码中的递归是如何工作的感到困惑: subsets :: [a] -> [[a]] subsets [] = [[]] subsets (x:xs) = [zs | ys <- subsets xs, zs <- [y

我对stack overflow和Haskell是新手,所以如果有其他方法,请告诉我

这在很大程度上重复了这个堆栈溢出问题,但是这个问题得到的答案并没有真正帮助我,我仍然对这个问题中的递归是如何工作的感到困惑。这是我为这个问题再次开始对话的尝试

问题是:

我对以下代码中的递归是如何工作的感到困惑:

subsets :: [a] -> [[a]]
subsets [] = [[]]
subsets (x:xs) = [zs | ys <- subsets xs, zs <- [ys, (x:ys)]]
我了解如何递归调用子集,以及如何访问子集
[]=[[]]
,但我不清楚它如何返回列表列表,以及它如何返回一些列表,如
[1]
[1,3]
,和
[2,3]


再说一遍,我对堆栈溢出还不熟悉,所以请告诉我除了重复这个问题之外,还有没有更好的方法

让我们首先澄清
子集[3]
。记住
ys[zs | ys[zs | ys[zs | ys]你不了解的最小输入是什么?你了解
子集[3]
是如何工作的吗?你了解
子集[2,3]
是如何工作的吗?我知道
子集[3]
可以工作,但列表中的任何整数都不能超过一个,我不明白。
zs如何澄清我上面的问题:我假设
subset[]
返回
[[]]
这是一个空列表的列表,但最终输出仅显示为单个列表
[]
。输出:
[[]],[3]]
为了完整起见,troll版本:
subsets=filterM(return[True,False])
非常感谢!!!我现在明白了我是如何看待代码错误的。
*Main> subsets [1,2,3]
[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
subsets (x:xs) = [zs | ys <- subsets xs, zs <- [ys, (x:ys)]]
Aggregate all zs
  where ys takes on in turn each of the subsets of the list without x,
  and for each ys,
    zs takes on the subset ys, and the subset ys and x together
   subsets [2,3]
=> ys takes on in turn each of the subsets of the list without 2
=> [[], [3]]

=> for each ys,
     zs takes on the subset ys, and the subset ys and 2 together
=> [[], [2], [3], [2,3]]