如何从记录中提取多个值 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]
其中每个 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)]
。有多种语法糖的方式可以做到这一点,例如:
- lambda:
map (\p -> (fname p, lname p, age p)) listOfPerson
- 记录通配符(需要
RecordWildCards
扩展):personTuple Person{..} = (fname, lname, age)
- 适用:
map ((,,) <$> fname <*> lname <*> age) listOfPerson
不过最后都一样
目前,我正在使用列表理解来浏览我的自定义数据类型的列表
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)]
。有多种语法糖的方式可以做到这一点,例如:
- lambda:
map (\p -> (fname p, lname p, age p)) listOfPerson
- 记录通配符(需要
RecordWildCards
扩展):personTuple Person{..} = (fname, lname, age)
- 适用:
map ((,,) <$> fname <*> lname <*> age) listOfPerson
不过最后都一样