【问题标题】:Filter with a predicate that takes more than one argument使用带有多个参数的谓词进行过滤
【发布时间】:2017-08-27 09:46:35
【问题描述】:

我有一个需要根据谓词函数过滤的项目列表。谓词函数需要多个参数才能成功返回结果。

这是我的函数类型声明,对于需要返回过滤列表的函数:

myFilter :: Int -> [[String]] -> [String] -> [[String]]

[[String]]是需要过滤的列表,是人名列表。一个人的名字表示如下["FirstName", "MiddleName", "LastName"]

[String] 是个人的姓名,例如["Bob", "Jane", "Alice"]

我需要过滤掉所有与个人名称至少有 Int 个相同名称的名称

例如,如果我要打电话

myFilter 2 [["a", "b", "c"],["d", "e", "f"]] ["a", "f", "b"]

我会得到

[["a", "b", "c"]] 因为["d", "e", "f"]["a", "f", "b"] 没有至少两个相同的名称。

我计划将其用作允许用户管理人员列表的更大程序的一部分。该程序的功能之一是按姓名搜索,根据用户输入的整数参数返回姓名匹配的所有人的列表。

我知道filter 函数,但似乎谓词函数只能是p :: Bool 类型。如您所见,我的谓词更复杂。

【问题讨论】:

    标签: list haskell filter


    【解决方案1】:

    尝试稍微移动一下参数:

    myFilter :: Int -> [String] -> [[String]] -> [[String]]
    

    如果我正确理解了这个问题,您想过滤 [[String]] 并返回 [[String]]。这很适合filter,它的类型为:

    filter :: (a -> Bool) -> [a] -> [a]
    

    具体来说,在这种情况下,a[String],所以现在你需要一个类型为 [String] -> Bool 的函数。

    但是,您确实需要更多的数据:匹配的数量和要搜索的名称,所以编写一个也接受这些参数的函数:

    pred :: Int -> [String] -> [String] -> Bool
    

    您现在可以部分应用 pred 与您要搜索的值,例如(pred 2 ["a", "f", "b"])。该函数的类型为[String] -> Bool,与filter 的要求相匹配。

    换句话说,你应该可以这样写:

    myFilter i target names = filter (pred i target) names
    

    如果需要,您可以使用 where 关键字或 let..in 语法在 myFilter 函数内定义 pred

    【讨论】:

      【解决方案2】:

      我猜你可以这样做;

      myFilter :: Int -> [[String]] -> [String] -> [[String]]
      myFilter n ass bs = filter (\as -> n <= length (filter (True ==) ((==) <$> as <*> bs))) ass
      
      *Main> myFilter 2 [["a", "b", "c"],["d", "e", "f"]] ["a", "f", "b"]
      [["a","b","c"]]
      

      所以as[[String]] 列表的每一项。

      (==) &lt;$&gt; as &lt;*&gt; bs) 部分的工作方式类似于; (==) &lt;$&gt; as 会将as 转换为一个应用列表函子,如[(=="a"), (=="b"), (=="c")],然后我们将应用程序中的每个函数应用于bs 的每个项目,如[(=="a"), (=="b"), (=="c")] &lt;*&gt; ["a", "f", "b"],结果为[True,False,False,False,False,True,False,False,False],我们过滤True 值并检查长度看看是不是&gt;= n

      我希望它很清楚。

      【讨论】:

        猜你喜欢
        • 2014-11-20
        • 2015-07-22
        • 1970-01-01
        • 1970-01-01
        • 2019-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多