如何从记录haskell

时间:2017-03-14 23:06:24

标签: haskell dictionary syntax extract record

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

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

谢谢

1 个答案:

答案 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)]。有很多种语法含糖的方法可以做到这一点,例如:

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

但最后它们都是一样的。