将我的工作Haskell代码转换为适当的Haskell代码

jth*_*tht 1 haskell

我正试图进入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)

jam*_*idh 8

您可以使用模式匹配来简化代码

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)

这也很懒.


Dav*_*her 5

作为手动递归:

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)

(虽然我个人并不认为最后一个读得很好).