我知道这个问题已经问过,但是答案偏离了主要问题。如何检查一个元素是否存在于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 –