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