list - 过滤列表列表

标签 list haskell filter

我想知道如何从列表列表中过滤整个列表

Example: [ ["Bob", "Baker", "male", "70000"],
         ["Alice", "Allen", "female", "82000"] ] 

现在我想过滤包含女性的列表。所以输出将是:
["Alice", "Allen", "female", "82000"]

谢谢

最佳答案

Ankur 的回答肯定会解决您的问题,但我想提出一个建议,让您的生活更轻松。似乎您将所有数据作为字符串存储在列表中,但实际上您想要的是一种可以以更有条理的方式保存所有这些数据的数据类型,这可以使用 Haskell 数据类型来完成,例如:

data Person = Person {
    firstName :: String,
    lastName :: String,
    gender :: String,
    salary :: String
    } deriving (Eq, Show)

然后,您可以轻松地使用 filter (("female" ==) . gender) a 对数据进行排序。 .虽然这是前面的更多代码,但稍后如果您要为“先生”、“夫人”等添加“标题”字段,那么将其添加为第一个字段或最后一个字段,此代码仍然有效。此外,如果由于某种原因您的值无效,例如 ["Bob", "Baker", "male", "70000", "female"] , Ankur 的解决方案会给你一个不正确的结果,但使用自定义数据类型,这甚至无法编译。

您可以通过一些调整进一步改进您的数据结构。我建议为性别创建一个数据类型,然后使用 IntDouble对于工资领域,所以你会有

data Gender = Male | Female deriving (Eq, Show, Read)

data Person = Person {
    firstName :: String,
    lastName :: String,
    gender :: Gender,
    salary :: Int
    } deriving (Eq, Show)

filtGender :: Gender -> [Person] -> [Person]
filtGender gend people = filter ((gend ==) . gender) people

main :: IO ()
main = do
    let people = [Person "Bob" "Baker" Male 70000,
                  Person "Alice" "Allen" Female 82000]
    putStr "The females are: "
    print $ filtGender Female people
    putStr "The males are: "
    print $ filtGender Male people

关于list - 过滤列表列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18979330/

相关文章:

android - 在闹钟 android 接收器中听到的 Action 是什么

c# - 在 ASP.NET Core 中实现 OrganizationUnit 过滤器

sql-server - 如何在触发触发器时获取 sql 查询,最多 n 级?

haskell - Haskell 或 OCaml 中的非本地类型推断真的有用吗?

c++ - GHCi 无法在 Windows 上加载 .dll 库(C++ 库)

haskell - 在没有 Yesod 的情况下在 Haskell 中使用 Hamlet

python空列表技巧

python - 在 python 列表中查找项目的排列,增加了复杂性

c# - 通用列表更改 C# 上的计数器

java - Scala - 如何过滤 KStream(Kafka Streams)