目前,我正在使用列表推导来浏览我的自定义数据类型列表
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
一次,或者以某种方式将多个地图调用合并到一个列表中,其中所有信息都按顺序排列?
例如这样的事情?
fas :: [Person] -> [String]
fas listOfPerson = map (fname, lname, age) listOfPerson
谢谢
答案 0 :(得分:3)
如果我理解你的要求正确,你只需要创建正确的功能来映射
renderPerson :: Person -> String
renderPerson p = "First name: " ++ fname p ++ "\nLast name: " ++ lname p
然后映射:
map renderPerson listOfPerson
将为您提供String
s。
但也许你想要一个元组列表呢?
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
但最后它们都是一样的。