我知道這個問題已經問過,但是答案偏離了主要問題。如何檢查一個元素是否存在於haskell的列表中?
這裏來檢查,如果在Haskell存在的元素
elem’ x (y : ys) = if x == y then True else elem’ x ys
我感到困惑的是,在Haskell (y : ys)
這增加y以YS的方法,那麼,如何這個功能只能檢查一個元素存在?因爲除了遞歸調用傳遞相同的y
到ys
以外,我沒有看到任何循環。
請賜教。
我知道這個問題已經問過,但是答案偏離了主要問題。如何檢查一個元素是否存在於haskell的列表中?
這裏來檢查,如果在Haskell存在的元素
elem’ x (y : ys) = if x == y then True else elem’ x ys
我感到困惑的是,在Haskell (y : ys)
這增加y以YS的方法,那麼,如何這個功能只能檢查一個元素存在?因爲除了遞歸調用傳遞相同的y
到ys
以外,我沒有看到任何循環。
請賜教。
我沒有看到任何環路這裏除了通過相同的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
我感到困惑的是,在Haskell(Y:YS),這增加y以YS 不,它不是,它是pattern matching
功能,它實際上將列表的第一個值綁定到y
,其餘部分綁定到ys
。 因此,當您遞歸調用elem’ x ys
時,您正在評估列表的其餘部分。 這叫做tail recursion pattern
不,(y:ys)不會將y添加到ys。 (y:ys)是整個列表。 y是該列表的第一個元素。 ys是列表中的其餘部分。 請參閱https://stackoverflow.com/questions/1696751/what-does-the-infix-operator-do-in-haskell –