我正在尝试在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
答案 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
只是列表的别名。请注意(++)
连接两个相同类型的列表。由于x
是Set a
,因此无法与Set (Set a)
连接。相反,您应该使用cons运算符(:)
,它将元素附加到列表的开头。
x : powerset xs