Haskell:检查Int是否在Int列表中

Jos*_*eph 38 haskell

我是Haskell的新手,对不起,如果这是一个基本问题.

我目前有一个Int的列表,我正在尝试创建一个函数,它接受一个变量x并返回一个布尔值,具体取决于该变量是否存在于列表中.

我有一个搜索,发现Data.List查找函数,但这个dosent似乎返回一个布尔值.

我正在使用GHCi.

谢谢,

Atn*_*nNn 85

首先找到您需要的功能类型.

要"检查是否"意味着返回True或False,一个Bool.

所以函数接受一个I​​nt,一个Int(又名[Int])列表并返回Bool:

Int -> [Int] -> Bool
Run Code Online (Sandbox Code Playgroud)

现在问一下hoogle.

elem :: Eq a => a -> [a] -> Bool
Run Code Online (Sandbox Code Playgroud)

Hoogle是一个非常有用的工具.您可以将它与ghci集成.

  • 问谷歌引领我来这里.你不必对OP很苛刻. (10认同)
  • 我怎样才能改善答案的基调?我并不是想要苛刻. (10认同)
  • 按类型搜索查找功能的非常有用的技巧。在 OOP 语言中,可以使用 .(dot) 来查找所有“方法”,而在 Haskell 中,可以通过这种方式搜索函数。挺有意思。 (3认同)
  • 总结一下,你可以使用`elem 1 [5,2,1,8]`或中缀方式`1 \`elem \`[5,2,1,8]`,在这两种情况下它都会返回'True`,因为1在列表中.当然你可以改用变量 (2认同)

eph*_*ent 18

如果标准elem功能不存在,您可能已经走上正轨find.

myElem :: (Eq a) => a -> [a] -> Bool
myElem x = maybe False (const True) . find (== x)
Run Code Online (Sandbox Code Playgroud)

还有很多其他方法可以实现它,比如

myElem x = any (== x)
myElem x = or . map (== x)
myElem x = not . null . filter (== x)
myElem x = foldr (\y b -> y == x || b) False
Run Code Online (Sandbox Code Playgroud)

等等


typ*_*gic 5

我正在尝试在业余时间学习 Haskell 的 2 个月。专业上,我做了几年 C/C++。我必须说,学习 Haskell 的第一个月是一段令人头疼的经历。如果问题足够简单,我总是尝试自己做事,而不是使用现有的 API,例如elem. 我正在慢慢学习FP的方式,下面是我的解决方案:

isMember n [] = False
isMember n (x:xs)
    | n == x = True
    | otherwise = isMember n xs
Run Code Online (Sandbox Code Playgroud)

用法:

isMember 2 [1,9,4,5] -- False
isMember 2 [4,5,2,9] -- True
Run Code Online (Sandbox Code Playgroud)