Haskell-从列表列表中产生人员列表

时间:2019-11-21 20:03:38

标签: haskell

列表列表包含以下条目。

[
  ["John","Doe","38\r"],
  ["Jane","Doe","35\r"]
]

Person数据类型的构造如下:

data Person = Person { firstName :: String
                     , lastName :: String   
                     , age :: Int  
                     } deriving (Show)

我正在尝试在Haskell中列出人员列表,以便最终的人员列表如下所示:

[
Person {firstName = "John", lastName = "Doe", age = 38},
Person {firstName = "Jane", lastName = "Doe", age = 35}
]

感谢您的帮助!请谢谢!

2 个答案:

答案 0 :(得分:0)

所以我们需要这种类型的函数:

f :: [[String]] -> [Person]

有一个功能可以帮助我们-map

stringsToPerson :: [String] -> Person
f = map stringsToPerson

现在,一个基本问题变得很清楚了-stringsToPerson不是类型安全的。用户可以给它一个空列表,该函数别无选择,只能返回一个错误。更好的类型是:

stringsToPerson :: (String, String, Int) -> Person
stringsToPerson :: [String] -> Maybe Person

Buuut假​​设您要坚持选择的类型,则可以通过模式匹配来实现:

stringsToPerson [firstName, lastName, age] = Person firstName lastName (read age)

答案 1 :(得分:0)

您可以执行以下操作;

data Person = Person { firstName :: String
                     , lastName :: String
                     , age :: Int
                     } deriving (Show)


mapper :: [[String]] -> [Person]
mapper = map makePerson
         where makePerson [f,l,a] = Person f l $ read a

*Main> mapper [["John","Doe","38\r"], ["Jane","Doe","35\r"]]
[Person {firstName = "John", lastName = "Doe", age = 38},Person {firstName = "Jane", lastName = "Doe", age = 35}]