【发布时间】:2018-03-17 16:22:33
【问题描述】:
我正在尝试编写一个 Haskell 程序,它可以返回用户定义集的分区集。集合 S 的划分被定义为 S 的一组非空、成对不相交的子集,其并集为 S。因此,[1,2,3] 返回[[[2],[3,1]],[[2,1],[3]],[[3,2,1]],[[1],[3,2]],[[1],[2],[3]]]。我想我可以利用我不久前编写的另一个程序从两组中找到笛卡尔积。所以,[1,2,3] ['a', 'b'] 返回[(1,'a'),(1,'b'),(2,'a'),(2,'b'),(3,'a'),(3,'b')]。但是,我不太确定如何。我认为它需要递归,如果这甚至可以适当地调整的话。这是子集代码:
type Set a = [a]
isElement :: Eq a => a -> [a] -> Bool
isElement x [] = False
isElement x (y:ys) = if(x==y) then True else isElement x ys
subset :: Eq a => Set a -> Set a -> Bool
subset [] xs = True
subset (y:ys) xs = if(isElement y xs == True)
then do subset ys xs
else do False
【问题讨论】:
-
递归。如果
X可以分区,X ∪ {a}怎么分区? -
小风格评论:您发布的
ifs 似乎是一种复杂的写作方式,分别为1)x==y || isElement x ys和2)isElement y xs && subset ys xs。这里不需要do,== True总是多余的。