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
在Haskell中,如果不使用map或lambda,如何制作功率集?_Haskell_Powerset - Fatal编程技术网

在Haskell中,如果不使用map或lambda,如何制作功率集?

在Haskell中,如果不使用map或lambda,如何制作功率集?,haskell,powerset,Haskell,Powerset,我正在尝试在Haskell中制作一个powerset(我对它非常陌生),但我无法确切地知道要制作一个没有map的powerset需要做什么。使用map和lambda,我找到了以下解决方案: powerset :: Set a -> Set (Set a) powerset [] = [[]] powerset (head:tail) = powerset tail >>= \set ->[set, head:set] powerset (x:xs) = map (x:)

我正在尝试在Haskell中制作一个powerset(我对它非常陌生),但我无法确切地知道要制作一个没有map的powerset需要做什么。使用map和lambda,我找到了以下解决方案:

powerset :: Set a -> Set (Set a)
powerset [] = [[]]
powerset (head:tail) = powerset tail >>= \set ->[set, head:set]
powerset (x:xs) = map (x:) (powerset xs) ++ powerset xs
这不是我想要的。我看了所有其他问题,没有找到我想要的答案。非常感谢您的帮助

编辑:这就是我到目前为止想到的。。这显然不起作用,但我正在努力

powerset :: Set a -> Set (Set a)
powerset [] = [[]]
powerset (x:xs) = [x + (powerset xs)] + powerset xs

您就快到了-如果您想使用列表理解,这相当于
map
,在这种情况下,您只需要一小步:

powerset (x:xs) = [x:ps | ps <- powerset xs] ++ powerset xs

powerset(x:xs)=[x:ps | ps你就快到了-如果你想使用列表理解,这相当于
map
,在这种情况下,你只需要一小步:

powerset (x:xs) = [x:ps | ps <- powerset xs] ++ powerset xs
powerset(x:xs)=[x:ps | ps来自评论:

带[a]“a”的“a”是一个刚性类型变量,受powerset::Set a->Set(Set a)在assignment2处的类型签名约束。hs:71:1在(+++)的第一个参数中,即x在表达式中,即x++(powerset xs)在(+++)的第一个参数中,即“[x++(powerset xs)]”

这是因为
powerset
返回一个
Set(Set a)
,其中
Set
只是列表的别名。请注意,
(++)
连接两个相同类型的列表。由于
x
是一个
集a
,因此它不能与
集(Set a)
连接。相反,您应该使用cons运算符
(:)
在列表开头追加一个元素

x : powerset xs
从评论中:

带[a]“a”的“a”是一个刚性类型变量,受powerset::Set a->Set(Set a)在assignment2处的类型签名约束。hs:71:1在(+++)的第一个参数中,即x在表达式中,即x++(powerset xs)在(+++)的第一个参数中,即“[x++(powerset xs)]”

这是因为
powerset
返回一个
Set(Set a)
,其中
Set
只是列表的别名。请注意,
(++)
连接两个相同类型的列表。由于
x
是一个
集a
,因此它不能与
集(Set a)
连接。相反,您应该使用cons运算符
(:)
在列表开头追加一个元素

x : powerset xs

你还对什么其他方法感兴趣?列表理解?我想你忘了说你已经定义了
类型集a=[a]
,并且你没有使用它,因为你没有告诉我们的错误部分是因为
(+)
只处理数字类型而不是列表-你应该使用
(++)
取而代之。@epsilonhalbe是的,我想使用列表理解!同样是的,我在创建函数之前这样做了:键入Set a=[a]并且我将更改为++:)lambda可以很容易地被命名函数替换,无论是在顶层还是在where或let子句中。因此,我用++对其进行了更改,但我得到了以下错误:
a'无法与
[a]匹配。
a'是一个严格的类型变量,由powerset::Set a->Set(Set a)的类型签名绑定在赋值时2.hs:71:1在
(++)的第一个参数中,即表达式中的
x++(powerset xs)在
(++)的第一个参数中,即“[x++(powerset xs)]”中,您还对什么方式感兴趣?列表理解?而且我想您忘了说您已经定义了
类型集a=[a]
,而您没有使用您没有告诉我们的错误中的一个,部分原因是
(+)
只处理数字类型而不是列表-您应该使用
(+)
。@epsilonhalbe是的,我想使用列表理解!也是的,我在创建函数之前这样做了:type Set a=[a]另外,我将更改为++:)lambda可以很容易地被命名函数替换,无论是在顶层还是在where或let子句中。因此,我用++对其进行了更改,但我得到了以下错误:“
a”无法与
[a]匹配。“
a”是一个严格的类型变量,由powerset::Set a->Set的类型签名绑定(在赋值处设置a)
(++)的第一个参数中的hs:71:1,即表达式中的
x++(powerset xs)
(++)的第一个参数中的x++(powerset xs),即“[x++(powerset xs)]“天哪,太感谢你了!你让一切对我来说都更有意义了。我以前看过列表的理解,但我并不真正理解它们。这非常有用:)另外,我的老师希望我们使用列表理解,这样我们就能准确地理解发生了什么。这是塔姆大学的一门编码语言课程!我完全同意map很重要。天哪,非常感谢!你让一切对我更有意义。我以前见过列表理解,但我并没有真正理解它们。这非常有帮助:)另外,我的导师希望我们使用列表理解,以便我们准确地理解发生了什么。这是塔姆大学的一门编码语言课程!我完全同意map很重要。我还发现切换[[]和[]是非常重要的在第二行中修复了所有问题!它现在可以用@epsilonhalbe的解决方案工作了!感谢您的帮助!@LauraAdams
切换[[]和[]在第二行中,修复了所有问题
这可能会修复编译器错误,但现在出现了一个逻辑错误,因为您只会得到一个大的长列表,而不是您需要的列表。我还发现切换[[]和[]第二行修复了所有问题!它现在可以用@epsilonhalbe的解决方案工作了!谢谢你的帮助!@LauraAdams
在第二行切换[[]]和[]修复了所有问题
这可能会修复编译器错误,但现在你有一个逻辑错误,因为你只会得到一个大的长列表,而不是你需要的列表列表。