簡體   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