返回任意数量的字段作为列表的 Haskell 函数

标签 haskell custom-type

我想编写一个 Haskell 函数,该函数采用具有 11 个字段的自定义类型,并返回所有字段值的列表,或将字段名称与其值相关联的映射。我不想必须显式地获取每个字段,因为那样会很冗长而且不太通用。有什么办法吗?

最佳答案

你写的东西在某种程度上是可能的,但不会很有用。

让我们假设我们坚持要写这个函数一会儿。鉴于字段的值可能有不同的类型,您可能更愿意生成一个元组。即

data MyType = MyType Int String Bool

getFields :: MyType -> (Int, String, Bool)
getFields (MyType a b c) = (a,b,c)

所以你现在可以这样调用它

let v = MyType 1 "Hello" True
let (x, y, z) = getFields v

现在,这实际上不是很有用,因为您可以在所有这些情况下使用模式匹配,例如

let v = MyType 1 "Hello" True
let (MyType x y z) = v

好吧,但是如果您想处理个别字段怎么办?喜欢

let x = fst (getFields v)

...如果没有“getFields”函数怎么办?那么,您可以简单地分配字段名称(您可能已经这样做了):

data MyType = MyType
          { i :: Int
          , s :: String
          , b :: Bool
          }

现在您可以免费访问各个字段的函数:

let x = i v

...因为为字段分配名称实际上会生成类似 i::MyType -> Ints::MyType -> String 的函数。

关于返回任意数量的字段作为列表的 Haskell 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16845057/

相关文章:

haskell - 无意义编程时 readFile 和 IO monad 之间没有合作

haskell - 类型族和类型构造函数

haskell - 从列表中删除所有实例

macos - 使用部署目标构建 Haskell macOS 可执行文件

haskell - 如何生成用于 Network.TLS 的自签名证书

java - 编写EnhancedUserType在Hibernate中保存类似字符串的信息,避免SQL注入(inject)

java - 使用 Hibernate 自定义 double[] UserType

go - 自定义 UnmarshalYAML,如何在自定义类型上实现 Unmarshaler 接口(interface)

c# - 如何使用数字创建枚举?