我在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
(其中seq
和domain
都排序)
然而,我努力将这段代码转换成Haskell。我想我只是使用列表(可能是无限的)而不是ss
和dd
,我想我会使用s = next(ss)
与s = head ss
和ss = tail ss
相同,但我不知道如何将其翻译成Haskell。我也不知道我该怎么处理这两个while
循环。我想我可以使用无限递归,但由于有两个循环,我不知道这是否需要两个函数或什么。
我不能完全让你的代码工作,但我认为这段代码应该与你的工作方式大致相同,在两个假设下:X和Y是排序的,所有元素都是唯一的。
我们想从xx
中删除yy
中的所有元素。在每一步中,我们只需要比较它们(x
和y
,在函数定义中)的第一个元素。这时可能发生三件事:
-
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