目前,我正在使用列表理解来浏览我的自定义数据类型的列表
data Person = Person{ fname :: String
, lname :: String
, age :: Int
, siblings :: [String]
}
目前我正在做的问题
["First name: "++ fname z++ "\n"++ "Last name: "++ lname z]
其中每个 z
是一个
。 Person
列表中的 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)]
.有多种语法糖的方法可以做到这一点,例如:
- λ:
map (\p -> (fname p, lname p, age p)) listOfPerson
- 记录通配符(需要
RecordWildCards
扩展):personTuple Person{..} = (fname, lname, age)
- 应用:
map ((,,) <$> fname <*> lname <*> age) listOfPerson
但最终都一样。
关于haskell - 如何从记录haskell中提取多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798187/