2017-08-03 74 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

相关问题