在Haskell中求给定集a和泛集U的补集
我试着编写一个函数(补码),它给定一个集合a和一个通用集合U,返回一个a相对于U的补码,并封装在Just类型构造函数中。我必须再次检查集合A是否不是U的子集,在这种情况下,我应该什么也不返回 基本上,我发现很少有参考资料解释如何检查集合(在我们的例子中是a)是否是U的子集。 基本上,使用“subset”函数(返回布尔值)来查看a是否是B的子集就足够了 我发现了一个不同的网站,该网站解释了如何创建补码集,而不使用递归函数,使用:在Haskell中求给定集a和泛集U的补集,haskell,set,Haskell,Set,我试着编写一个函数(补码),它给定一个集合a和一个通用集合U,返回一个a相对于U的补码,并封装在Just类型构造函数中。我必须再次检查集合A是否不是U的子集,在这种情况下,我应该什么也不返回 基本上,我发现很少有参考资料解释如何检查集合(在我们的例子中是a)是否是U的子集。 基本上,使用“subset”函数(返回布尔值)来查看a是否是B的子集就足够了 我发现了一个不同的网站,该网站解释了如何创建补码集,而不使用递归函数,使用: import Data.Set(Set) import qualif
import Data.Set(Set)
import qualified Data.Set as Set
唯一的问题是我无法导入任何外部模块来解决此问题
该函数的签名为:
complement :: (Eq a) => [a] -> [a] -> Maybe [a]
我期望得到以下结果:
complement [1,2,3] [1..5] = Just [4,5]
complement [1,2,3] [2..5] = Nothing
有谁能帮我解决这个问题吗?我不想为你解决你的问题-我相信解决办法应该是你自己的工作。但是,我将提供一个可以帮助您的功能列表,您不必导入这些功能:
:返回filter f list
的所有元素,其中list
返回f element
。例如,True
给出过滤器(\x->(x/=0))[0,1,0,2,3]
。这对于[1,2,3]
函数很有用,该函数反转not
;例如,Bool
给出过滤器(\x->not(x>2))[1,2,3,4,5]
[1,2]
:如果all f list
为f
的所有元素提供list
,则返回True
。例如,True
给出all(\x->(x/=0))[1,2,3]
;但是,True
给出了all(\x->(x/=0))[1,0,2,3]
False
- 如果
是x
的一个元素,则list
(这实际上只是x`elem`list
的语法糖)返回true。例如,elem x list
给出1`elem`[1,2,3]
,但True
给出0`elem`[1,2,3]
False
同样,我不会直接给你这个问题的解决方案。但我可以向您保证,如果您以正确的方式将上述函数与
Just
和Nothing
构造函数组合在一起,您可以使用补足
函数。您的第一次尝试是什么?到目前为止,您还没有表现出任何努力,请这样做。我真的认为,如果您不被允许转换为集合,那么以列表的形式编写这篇文章将不会特别愉快。这肯定是非常低效的。那么,到目前为止您尝试了什么?尝试在第一个列表参数上递归。我认为这是我提出的相同解决方案。使用MonadComprehensions
扩展还可以消除显式使用Just
或Nothing