haskell - 如何从记录haskell中提取多个值

标签 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,或者以某种方式将多个 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/

相关文章:

haskell - 有 "ApplicativeIO"类吗?

multithreading - 并发(多线程)程序挂起,除非我打印出一些东西

python - 是否可以创建字典 "template"?

arrays - 如何从数组字典中的整数数组中获取最大值

python - 我收到语法错误,但不确定原因

ruby - 如何使 Ruby 变量在条件表达式中的计算结果为 false

haskell - 如何使用Pos haskell计算距离

python - 为什么我的值字典需要浅拷贝才能正确更新?

c - 使 int foo(int bar[][N]) 与 int ** baz 一起工作

haskell - 如何 "show"小写的构造函数