我正试图进入haskell,所以我搞乱了,我写了自己的elem函数,但它看起来很笨重.什么是哈克尔的方法来实现这一目标?
elem' x xs =
if null xs
then False
else
if x == (head xs)
then True
else elem' x (tail xs)
Run Code Online (Sandbox Code Playgroud)
您可以使用模式匹配来简化代码
elem' _ [] = False
elem ' x1 (x2:_) | x1 == x2 = True
elem' x (_:ret) = elem' x rest
Run Code Online (Sandbox Code Playgroud)
或者你可以采取一种完全不同的方法
elem' x = not . null . filter (== x)
Run Code Online (Sandbox Code Playgroud)
(通过懒惰,它不会超过找到的元素,所以你可以这样做elem' 4 [1..])
对于那些倾向的人,也有一种折叠方法
elem' x = foldr ((||) . (x==)) False
Run Code Online (Sandbox Code Playgroud)
这也很懒.
作为手动递归:
elem' :: Eq a => a -> [a] -> Bool
elem' x [] = False
elem' x (y:ys) = x == y || elem' x ys
Run Code Online (Sandbox Code Playgroud)
或者使用any功能:
elem' x xs = any (==x) xs
Run Code Online (Sandbox Code Playgroud)
要么
elem' x = any (==x)
Run Code Online (Sandbox Code Playgroud)
甚至
elem' = any . (==)
Run Code Online (Sandbox Code Playgroud)
(虽然我个人并不认为最后一个读得很好).