List 如何检查haskell中的列表中是否存在元素?

List 如何检查haskell中的列表中是否存在元素?,list,function,haskell,if-statement,recursion,List,Function,Haskell,If Statement,Recursion,我知道早些时候有人问过这个问题,但答案偏离了主要问题 下面是一个检查Haskell中是否存在元素的方法 elem'x(y:ys)=如果x==y,则为真,否则elem'x ys 我感到困惑的是,在Haskell(y:ys)中,这会将y添加到ys中,那么这个函数如何真正检查元素是否存在?因为除了递归调用将相同的y传递给ys,我在这里看不到任何循环 请开导我 我在这里没有看到任何循环,除了将相同的y传递给ys的递归调用 递归部分将列表的尾部传递给elem'函数,而不是同一个列表。因此,一旦到达列表的末

我知道早些时候有人问过这个问题,但答案偏离了主要问题

下面是一个检查Haskell中是否存在元素的方法

elem'x(y:ys)=如果x==y,则为真,否则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
编辑:进一步澄清您的评论

您可以这样描述递归调用:

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中 不,它不是,这是一个特性,它实际上是将列表的第一个值绑定到
y
,其余值绑定到
ys
。 因此,当您进行递归调用时,您正在评估列表的其余部分。
这称为

No,(y:ys)不会将y添加到ys中。(y:ys)是整个列表。y是该列表的第一个元素。ys是列表的其余部分。哦,我明白了,谢谢你消除了这一困惑,但是整个递归是如何工作的呢?假设我们在a
[1..10]
中查找4,当我们调用函数时,它如何检查列表中的每个元素?我在答案中添加了一个可视化示例,试图帮助您描述发生的情况谢谢您Chad,非常感谢您的帮助,现在它有意义了。所以在每次通话中,头部都会发生变化,这就是为什么它会一直循环到最后。