如何在Haskell中不使用map或lambda制作powerset?

时间:2016-09-14 22:51:43

标签: haskell powerset

我正在尝试在Haskell中创建一个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

2 个答案:

答案 0 :(得分:2)

你几乎就在那里 - 如果你想使用列表推导,在这种情况下相当于map,你只需要一小步:

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

<子> 我很好奇 - 你为什么要避免map,它是你会发现的最重要的函数式编程模式之一!但我想这不是我答案的一部分 - 只是旁注。

答案 1 :(得分:1)

来自评论:

  

一个&#39;用[a]&#39;一个&#39;是一个刚性类型变量,由powerset :: Set a - &gt;的类型签名绑定。在assignment2.hs:71:1中设置(设置a)在(++)&#39;的第一个参数中,即x&#39;在表达式中:x ++(powerset xs)在(++)&#39;的第一个参数中,即`[x ++(powerset xs)]&#39;

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

x : powerset xs