等价于此Python代码的Haskell



我在Python之后学习Haskell,我认为创建一个函数来查找序列中不在另一个序列中的所有项(其中两个序列都有可以比较的元素)将是一个有趣的练习。我用Python编写了一些代码:

def inverse(seq, domain):
    ss = iter(seq)
    dd = iter(domain)
    while True:
        s = next(ss)
        while True:
            d = next(dd)
            if d != s:
                yield d
            if d >= s:
                break

(其中seqdomain都排序)

然而,我努力将这段代码转换成Haskell。我想我只是使用列表(可能是无限的)而不是ssdd,我想我会使用s = next(ss)s = head ssss = tail ss相同,但我不知道如何将其翻译成Haskell。我也不知道我该怎么处理这两个while循环。我想我可以使用无限递归,但由于有两个循环,我不知道这是否需要两个函数或什么。

我不能完全让你的代码工作,但我认为这段代码应该与你的工作方式大致相同,在两个假设下:X和Y是排序的,所有元素都是唯一的。

我们想从xx中删除yy中的所有元素。在每一步中,我们只需要比较它们(xy,在函数定义中)的第一个元素。这时可能发生三件事:

  • x小于y,这意味着x不在yy中,所以我们可以接受x
  • x = y,拒收x
  • x大于y,这意味着我们需要在yy中前进,才能确定是拒绝还是接受x

这是函数定义:

minus :: Ord a => [a] -> [a] -> [a]  
minus xx@(x:xs) yy@(y:ys) = case (compare x y) of  
  LT -> x : minus xs yy  
  EQ ->     minus xs ys  
  GT ->     minus xx ys  
minus xs _  = xs  

最新更新