Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中求给定集a和泛集U的补集_Haskell_Set - Fatal编程技术网

在Haskell中求给定集a和泛集U的补集

在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

我试着编写一个函数(补码),它给定一个集合a和一个通用集合U,返回一个a相对于U的补码,并封装在Just类型构造函数中。我必须再次检查集合A是否不是U的子集,在这种情况下,我应该什么也不返回

基本上,我发现很少有参考资料解释如何检查集合(在我们的例子中是a)是否是U的子集。 基本上,使用“subset”函数(返回布尔值)来查看a是否是B的子集就足够了

我发现了一个不同的网站,该网站解释了如何创建补码集,而不使用递归函数,使用:

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
    (这实际上只是
    elem x list
    的语法糖)返回true。例如,
    1`elem`[1,2,3]
    给出
    True
    ,但
    0`elem`[1,2,3]
    给出
    False

同样,我不会直接给你这个问题的解决方案。但我可以向您保证,如果您以正确的方式将上述函数与
Just
Nothing
构造函数组合在一起,您可以使用
补足
函数。

您的第一次尝试是什么?到目前为止,您还没有表现出任何努力,请这样做。我真的认为,如果您不被允许转换为集合,那么以列表的形式编写这篇文章将不会特别愉快。这肯定是非常低效的。那么,到目前为止您尝试了什么?尝试在第一个列表参数上递归。我认为这是我提出的相同解决方案。使用
MonadComprehensions
扩展还可以消除显式使用
Just
Nothing