2017-08-03 72 views
-1

我知道這個問題已經問過,但是答案偏離了主要問題。如何檢查一個元素是否存在於haskell的列表中?

這裏來檢查,如果在Haskell存在的元素

elem’ x (y : ys) = if x == y then True else elem’ x ys

我感到困惑的是,在Haskell (y : ys)這增加y以YS的方法,那麼,如何這個功能只能檢查一個元素存在?因爲除了遞歸調用傳遞相同的yys以外,我沒有看到任何循環。

請賜教。

+0

不,(y:ys)不會將y添加到ys。 (y:ys)是整個列表。 y是該列表的第一個元素。 ys是列表中的其餘部分。 請參閱https://stackoverflow.com/questions/1696751/what-does-the-infix-operator-do-in-haskell –

回答

4

我沒有看到任何環路這裏除了通過相同的Y遞歸調用YS

遞歸部分經過列表到elem'功能,不一樣的名單。因此,一旦得到該列表的末尾,剩下的唯一的尾巴是空列表,[],應該在這樣的另一個功能模式終止:

elem' _ [] = False 

編輯:進一步澄清的評論

你能想象的遞歸調用是這樣的:

-- assuming elem' is defined as: 
elem' _ [] = False 
elem' x (y : ys) = if x == y then True else elem' x ys 

-- calling elem' trying to find 6 in [1..5] 
elem' 6 (1 : [2, 3, 4, 5]) = if 6 == 1 then True else elem' 6 [2, 3, 4, 5] 
elem' 6 (2 : [3, 4, 5]) = if 6 == 2 then True else elem' 6 [3, 4, 5] 
elem' 6 (3 : [4, 5])  = if 6 == 3 then True else elem' 6 [4, 5] 
elem' 6 (4 : [5])   = if 6 == 4 then True else elem' 6 [5] 
elem' 6 (5 : [])   = if 6 == 5 then True else elem' 6 [] 
elem' 6 []     = False 
+0

哦,我明白了,感謝清除這種困惑,但那麼整個遞歸如何工作呢?因此,讓我們說,當我們調用函數時,在'[1..10]'中尋找4,它是如何檢查列表中的每個元素的? – James

+0

我已經添加了一個視覺示例來回答,試圖幫助你瞭解發生了什麼 –

+0

謝謝乍得,真的很感謝你的幫助,現在它是有道理的。所以在每次通話中,頭部都會發生變化,這就是爲什麼它會一直循環到最後。 – James

0

我感到困惑的是,在Haskell(Y:YS),這增加y以YS 不,它不是,它是pattern matching功能,它實際上將列表的第一個值綁定到y,其餘部分綁定到ys。 因此,當您遞歸調用elem’ x ys時,您正在評估列表的其餘部分。 這叫做tail recursion pattern

相關問題