如何在 Haskell 中不使用 map 或 lambda 来创建 powerset?

How do I make a powerset without using map or lambda in Haskell?

我正在尝试在 Haskell 中制作一个 powerset(我对它很陌生),但我不知道我需要做什么才能在没有地图的情况下制作一个 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

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

来自评论:

a' with [a]' a' is a rigid type variable bound by the type signature for powerset :: Set a -> Set (Set a) at assignment2.hs:71:1 In the first argument of (++)', namely x' In the expression: x ++ (powerset xs) In the first argument of (++)', namely `[x ++ (powerset xs)]'

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

x : powerset xs