繁体   English   中英

Haskell相当于这个Python代码

[英]Haskell equivalent of this Python code

我在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  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM