【问题标题】:Haskell: Check if Int is in a list of Int'sHaskell:检查 Int 是否在 Int 的列表中
【发布时间】:2018-10-07 16:41:53
【问题描述】:

我是 Haskell 的新手,如果这是一个基本问题,我很抱歉。

我目前有一个 Int 列表,我正在尝试创建一个函数,该函数接受一个变量 x 并根据该变量是否存在于列表中返回一个布尔值。

我已经搜索并找到了 Data.List 查找功能,但这个剂量似乎返回一个布尔值。

我正在使用 GHCi。

谢谢,

【问题讨论】:

    标签: haskell


    【解决方案1】:

    先找到你需要的函数的类型。

    “检查是否”意味着返回 True 或 False,一个 Bool。

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

    Int -> [Int] -> Bool
    

    现在ask hoogle

    elem :: Eq a => a -> [a] -> Bool
    

    Hoogle 是一个非常有用的工具。你可以integrate it with ghci

    【讨论】:

    • 问谷歌把我带到这里。您不必对 OP 苛刻。
    • 如何提高回答的语气?我并不想变得苛刻。
    • 总结你可以使用elem 1 [5, 2, 1, 8]或中缀方式1 `elem` [5, 2, 1, 8],在这两种情况下它都会返回True,因为1在列表中。当然你可以使用变量来代替
    • 非常有用的按类型搜索来查找功能的技巧。在 OOP 语言中,可以使用 .(dot) 来查找所有“方法”,而在 Haskell 中,可以通过这种方式搜索函数。很有趣。
    • Hoogle 是一个很棒的工具,谢谢!我想我是在几年前了解它的,当时我还没有真正理解函数式设计模式,也没有意识到它有多么有用。
    【解决方案2】:

    如果标准的elem 函数不存在,那么find 可能是正确的。

    myElem :: (Eq a) => a -> [a] -> Bool
    myElem x = maybe False (const True) . find (== x)
    

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

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

    等等

    【讨论】:

      【解决方案3】:

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

      isMember n [] = False
      isMember n (x:xs)
          | n == x = True
          | otherwise = isMember n xs
      

      用法:

      isMember 2 [1,9,4,5] -- False
      isMember 2 [4,5,2,9] -- True
      

      【讨论】:

        【解决方案4】:

        我这样做更简单。

        l=[1,2,3,4,5]
        
        
        checkIfElem :: Int -> [Int] ->Bool
        checkIfElem x l 
                 |x`elem` l =True
                 |otherwise=False
        

        【讨论】:

        • 这确实很简单,但也可以说这是编写checkIfElem = elem 定义的一种极其复杂的方式,因为它完全 等同于它! (Guards 已经检查了布尔值,| condition = True| otherwise = False 因此等同于简单的= condition。剩下的就是checkIfElem x l = elem x l,通过 η-reduction 你可以去掉两边的参数。)
        • 我不认为这很简单。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-15
        • 1970-01-01
        • 2020-10-13
        • 2015-11-21
        • 2018-07-18
        • 1970-01-01
        相关资源
        最近更新 更多