如何从记录中提取多个值 haskell

How to extract multiple values from a record haskell

目前,我正在使用列表理解来浏览我的自定义数据类型的列表

data Person = Person{ fname :: String
                    , lname :: String
                    , age :: Int
                    , siblings :: [String]
                    }

目前我正在做的问题 ["First name: " ++ fname z ++ "\n" ++ "Last name: " ++ lname z] 其中每个 zPerson 列表中的 Person

我试过使用类似

的东西
fas :: [Person] -> [String]
fas listOfPerson = map fname listOfPerson

但是如何使用 map 从记录中获取多个字段? 据我了解,map 需要一个函数和一个列表,并将该函数应用于列表中的每个元素,从而生成一个新列表。因为我希望输出是单个列表,所以我只需要调用 map 一次,或者以某种方式将多个 map 调用组合成一个列表,其中所有信息都是有序的?

例如像这样的东西?

fas :: [Person] -> [String]
fas listOfPerson = map (fname, lname, age) listOfPerson

谢谢

如果我正确理解你的问题,你只需要创建正确的函数来映射

renderPerson :: Person -> String
renderPerson p = "First name: " ++ fname p ++ "\nLast name: " ++ lname p

然后映射:

map renderPerson listOfPerson

这将为您提供 String 的列表。

但也许您想要一个元组列表?

personTuple :: Person -> (String, String, Int)
personTuple p = (fname p, lname p, age p)

并使用

map personTuple listOfPerson

这会给你一个 [(String, String, Int)]。有多种语法糖的方式可以做到这一点,例如:

  • lambda: map (\p -> (fname p, lname p, age p)) listOfPerson
  • 记录通配符(需要RecordWildCards扩展):personTuple Person{..} = (fname, lname, age)
  • 适用: map ((,,) <$> fname <*> lname <*> age) listOfPerson

不过最后都一样