在Haskell中,如果不使用map或lambda,如何制作功率集?
我正在尝试在Haskell中制作一个powerset(我对它非常陌生),但我无法确切地知道要制作一个没有map的powerset需要做什么。使用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:)
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在第二行切换[[]]和[]修复了所有问题
这可能会修复编译器错误,但现在你有一个逻辑错误,因为你只会得到一个大的长列表,而不是你需要的列表列表。