[英]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
( 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.